我正在寻找带有变量数组/列表的多动态插入。插入的数量总是不同的。
我想替换
insert into my table (col 1, col 2)
select *
from unnest(array[1, 2], array[3, 4]);
与
insert into my table (col 1, col 2)
select *
from unnest(:list-of-inserts);
答案 0 :(得分:1)
取决于您是否要创建包含数据的新表?
这可能很简单:
SELECT * INTO table FROM unnest(array[1, 2], array[3, 4]);
OR
在临时表中执行相同的操作:
SELECT * INTO temp mytable FROM unnest(array[1, 2], array[3, 4]);
然后
INSERT INTO table (col 1, col 2) SELECT col1, col2 FROM mytable;
希望这会回答你的问题。
答案 1 :(得分:0)
我将它包装在一个函数中...这将很好地转换为任何具有PostgreSQL数据适配器的编程语言,这几乎就是所有这些。作为一个额外的好处,它也将在psql中运行良好。
CREATE OR REPLACE FUNCTION ez_insert(list1 integer[], list2 integer[])
RETURNS integer AS
$BODY$
DECLARE
rowcount integer;
BEGIN
insert into my_table (col_1, col_2)
values
(unnest (list1), unnest (list2));
GET DIAGNOSTICS rowcount = ROW_COUNT;
return rowcount;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
调用:
select ez_insert (array[1, 2, 3], array[7, 8, 9])
警告 - 如果您的阵列大小不同,则会出现奇怪现象。
以下是C#中实现的快速示例:
NpgsqlCommand cmd = new NpgsqlCommand("select ez_insert(:ARRAY1, :ARRAY2)", conn);
cmd.Parameters.Add(new NpgsqlParameter("ARRAY1",
NpgsqlDbType.Array | NpgsqlDbType.Integer));
cmd.Parameters.Add(new NpgsqlParameter("ARRAY2",
NpgsqlDbType.Array | NpgsqlDbType.Integer));
cmd.Parameters[0].Value = ar1;
cmd.Parameters[1].Value = ar2;
int inserts = (int)cmd.ExecuteScalar();