ujetl/config_util/ujetl_insert_generator.sql

74 lines
1.8 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION pg_temp.ujetl_insert(sch text, tabname text)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
s text := '';
header text := '';
col_list text := '';
vals text := '';
sets text := '';
changes text := '';
is_first boolean := true;
colinfo record;
pks text;
begin
SELECT
array_to_string(array_agg(pg_attribute.attname::text ),', ') into pks
FROM
pg_index,
pg_class,
pg_attribute,
pg_namespace
WHERE
pg_class.relname = tabname AND
indrelid = pg_class.oid AND
nspname = sch AND
pg_class.relnamespace = pg_namespace.oid AND
pg_attribute.attrelid = pg_class.oid AND
pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary ;
header := 'INSERT INTO '||sch||'.'||tabname||E' as t (\n ';
for colinfo in
select
*
from
information_schema.columns
where
table_schema = 'bi_processing'
and table_name = 'player'
order by ordinal_position
loop
if not is_first then
col_list := col_list || E',\n ';
vals := vals || E',\n ';
sets := sets || E',\n ';
changes := changes || E'\n OR ';
end if;
col_list := col_list || colinfo.column_name;
vals := vals || '?::' || colinfo.data_type;
sets := sets || colinfo.column_name || E' = EXCLUDED.' || colinfo.column_name;
changes := changes || E't.' || colinfo.column_name || E' IS DISTINCT FROM EXCLUDED.' || colinfo.column_name;
is_first = false;
end loop;
s := header ||
col_list ||
E'\n)VALUES(\n ' ||
vals ||
E')\nON CONFLICT(' || pks || E') DO UPDATE\nSET\n ' ||
sets ||
E'\nWHERE\n '||
changes;
return s;
end;
$function$
;