Postgresql多插入数组变量
Postgresql multi Insert with array variable
我想用变量 array/list 进行多重动态插入。插入的数量将始终变化。
我想更换
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);
取决于你是否想用你的数据创建一个新的Table?
这可能很简单:
SELECT * INTO table FROM unnest(array[1, 2], array[3, 4]);
或
临时做同样的事情 table :
SELECT * INTO temp mytable FROM unnest(array[1, 2], array[3, 4]);
然后
INSERT INTO table (col 1, col 2) SELECT col1, col2 FROM mytable;
希望这能回答您的问题。
我将它包装在一个函数中...然后这将很好地翻译成任何具有 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();
我想用变量 array/list 进行多重动态插入。插入的数量将始终变化。
我想更换
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);
取决于你是否想用你的数据创建一个新的Table?
这可能很简单:
SELECT * INTO table FROM unnest(array[1, 2], array[3, 4]);
或
临时做同样的事情 table :
SELECT * INTO temp mytable FROM unnest(array[1, 2], array[3, 4]);
然后
INSERT INTO table (col 1, col 2) SELECT col1, col2 FROM mytable;
希望这能回答您的问题。
我将它包装在一个函数中...然后这将很好地翻译成任何具有 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();