diff --git a/config_util/ujetl_insert_generator.sql b/config_util/ujetl_insert_generator.sql new file mode 100644 index 0000000..e7b74b4 --- /dev/null +++ b/config_util/ujetl_insert_generator.sql @@ -0,0 +1,74 @@ +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$ +; + + + + + +