我需要在具有可变列数的表中执行动态insert
。
现在,我引用quote_ident
的列名和quote_nullable
的实际值,然后用array_to_string
加入它们:
for ... loop
...
cols := array_append(cols, quote_ident(column_name));
vals := array_append(vals, quote_nullable(column_value));
end loop;
execute format('insert into %s (%s) values (%s)',
target_table,
array_to_string(cols, ', ')
array_to_string(vals, ', ')
);
这是一个遍布各处的模式,包括官方文档。但感觉有点不洁净。我宁愿将值数组传递给using
子句中的参数:
execute format('insert into %s (%s) ... $1 ...',
target_table,
array_to_string(cols, ', ')
)
using vals;
请注意using vals
,这是我想要实现的目标。但我似乎无法填写insert
声明中的点。也许某种select ... from ...
?
更一般地说,如何将数组转换为记录/元组/行类型?
答案 0 :(得分:0)
我在制作中使用的代码非常类似:
EXECUTE ( SELECT 'insert into sometable '
'('||string_agg(quote_ident(p.key),',') ||
') values ('|| string_agg(quote_nullable(p.value),',') || ');'
FROM each(payload) as p
);
但是这里的有效负载是一个hstore,而不是一对数组。