Thread: Number or parameters for functions - limited to 32 ?
I am attempting to port and application that was designed for MS-SQL to Postgres and bumped into a limitation of pg functions, namely that pg functions can only support 32 parameters. Our app takes records from a only cobol file(s) and populates an SQL table(s), such that one table in the db = one file from the file system. With MS-SQL we use a stored procedure to handle the update/inserts and pass the fields information as parameters to the procedure as part of "EXECUTE" command. Sometimes there can be as many as 50+ parameters to be passed. Typically pg functions as offered as the equivalent to "store procedures", however, in this case seems to be a limitation. If anyone has any other suggestions, we would appreciate some input.
imageguy wrote: > I am attempting to port and application that was designed for MS-SQL > to Postgres and bumped into a limitation of pg functions, namely that > pg functions can only support 32 parameters. I thought it had been increased to 64, but I'm sure you're right. > Our app takes records from a only cobol file(s) and populates an SQL > table(s), such that one table in the db = one file from the file > system. > > With MS-SQL we use a stored procedure to handle the update/inserts and > pass the fields information as parameters to the procedure as part of > "EXECUTE" command. Sometimes there can be as many as 50+ parameters > to be passed. Ah, but it's a record, so pass a record type in: CREATE TYPE cobol_file_type AS (a integer, b text, c varchar, d date); CREATE FUNCTION build_tables1(c cobol_file_type)... Each existing table has its own type defined too (with the same name), which might save you some time. -- Richard Huxton Archonet Ltd
Richard Huxton <dev@archonet.com> writes: > imageguy wrote: >> I am attempting to port and application that was designed for MS-SQL >> to Postgres and bumped into a limitation of pg functions, namely that >> pg functions can only support 32 parameters. > I thought it had been increased to 64, but I'm sure you're right. It was raised to 100 in 8.1. regards, tom lane
Just a FYI, you can get around the 32 param limit in older versions of postgresql by passing the function a varchar/text array, then use the built in array functions to pull the "params" from the passed array. Something like this(not tested code, just a sample): CREATE or REPLACE FUNCTION test_func(varchar) RETURNS void AS $BODY$ DECLARE IN_ARRAY text[] ; ACCOUNTNUMBER_IN varchar; BEGIN IN_ARRAY = string_to_array($1,'~^~'); --use a unique delimiter ACCOUNTNUMBER_IN = IN_ARRAY[1]; return; END $BODY$ LANGUAGE 'plpgsql' VOLATILE; Later, Tony Caduto AM Software Design Home of Lightning Admin for PostgreSQL and MySQL http://www.amsoftwaredesign.com
On Apr 8, 12:20 pm, t...@sss.pgh.pa.us (Tom Lane) wrote: > Richard Huxton <d...@archonet.com> writes: > > imageguy wrote: > >> I am attempting to port and application that was designed for MS-SQL > >> to Postgres and bumped into a limitation of pg functions, namely that > >> pg functions can only support 32 parameters. > > I thought it had been increased to 64, but I'm sure you're right. > > It was raised to 100 in 8.1. > > regards, tom lane Thanks Tom. - forgive me for asking but where would I find this in the docs ? Richard - thanks for the tip on the record type
imageguy <imageguy1206@gmail.com> writes: > On Apr 8, 12:20�pm, t...@sss.pgh.pa.us (Tom Lane) wrote: >> It was raised to 100 in 8.1. > Thanks Tom. > - forgive me for asking but where would I find this in the docs ? Under the max_function_args parameter, or in the 8.1 release notes ... regards, tom lane
> Ah, but it's a record, so pass a record type in: > > CREATE TYPE cobol_file_type AS (a integer, b text, c varchar, d date); > CREATE FUNCTION build_tables1(c cobol_file_type)... > > Each existing table has its own type defined too (with the same name), > which might save you some time. > > -- > Richard Huxton > Archonet Ltd This was exactly the solution that worked. We used the tables record type. Thanks again for the tip. g.