begin; create or replace function build_insert_functions() returns varchar as ' declare rt_string varchar; tables record; columns record; keys record; key_type varchar; field_list varchar; type_list varchar; alias_list varchar; column_count int; key_name varchar; field_length varchar; update_string varchar; begin rt_string := ''''; FOR tables in select substring(conname from 1 for (char_length(conname)-5)) as table_name, conkey[1] as key_position FROM pg_constraint WHERE contype=''p'' ORDER BY 1 LOOP field_list := ''''; type_list := ''''; alias_list := ''''; column_count := 1; FOR columns in SELECT ordinal_position, column_name, character_maximum_length, udt_name FROM information_schema.columns WHERE table_name = tables.table_name ORDER BY ordinal_position LOOP if tables.key_position = columns.ordinal_position then key_name := columns.column_name; key_type := columns.udt_name; else field_length = ''''; if columns.udt_name = ''varchar'' or columns.udt_name = ''char'' or columns.udt_name = ''bpchar'' then field_length := ''('' || columns.character_maximum_length || '')''; end if; field_list := field_list || ''\n\t\t\t'' || columns.column_name || '', ''; alias_list := alias_list || ''\n\t\t\t'' || ''$'' || column_count || '', ''; type_list := type_list || columns.udt_name || field_length || '', ''; column_count = column_count + 1; end if; END LOOP; if char_length(field_list) > 0 THEN field_list := substring(field_list from 1 for (char_length(field_list)-2)); alias_list := substring(alias_list from 1 for (char_length(alias_list)-2)); type_list := substring(type_list from 1 for (char_length(type_list)-2)); rt_string := rt_string || ''\n\n''; rt_string := rt_string || ''CREATE OR REPLACE FUNCTION '' || tables.table_name || ''_insert('' || type_list || '') RETURNS '' || key_type || '' AS \n''; rt_string := rt_string || chr(39); rt_string := rt_string || ''\n\tBEGIN\n''; rt_string := rt_string || ''\t\tINSERT INTO '' || tables.table_name || ''('' || field_list || '') ''; rt_string := rt_string || ''\n\t\tVALUES ('' || alias_list || '');\n''; rt_string := rt_string || ''\t\tIF NOT FOUND THEN\n''; rt_string := rt_string || ''\t\t\tRETURN 0;\n''; rt_string := rt_string || ''\t\tELSE\n''; rt_string := rt_string || ''\t\t\tRETURN currval("'' || tables.table_name || ''_'' || key_name || ''_seq");\n''; rt_string := rt_string || ''\t\tEND IF;\n''; rt_string := rt_string || ''\tEND;\n''; rt_string := rt_string || chr(39) || '' LANGUAGE plpgsql;''; end if; end loop; return rt_string; end; ' language plpgsql; Select * from build_insert_functions(); ROLLBACK;