我想在PostgreSQL中的函数表中插入多行。
这是我的表
CREATE TABLE mahasiswa
(
nim CHAR(10),
nama VACHAR(40)
CONSTRAINT pk_nim PRIMARY KEY (nim)
)
;
这是我创建的功能
CREATE FUNCTION insertdata(CHAR(10),varchar(40))
RETURNS VOID AS
$$
INSERT INTO mahasiswa VALUES ($1,$2);
$$
LANGUAGE 'sql';
当我像这样调用函数时
SELECT insertdata ('1234567890','Nahrun'),
('0987654321','Hartono');
只插入一行。
如何修改我的函数以一次插入多行?
答案 0 :(得分:10)
您拥有的功能应该是:
CREATE FUNCTION insertdata(varchar(10),varchar(40))
RETURNS VOID AS
$$
INSERT INTO mahasiswa(col_name1, col_name2)
VALUES ($1,$2);
$$
LANGUAGE sql STRICT;
不要引用语言名称。它是一个标识符。
始终提供包含持久语句的目标列表。否则,如果稍后更改表定义,则该函数可能会以意想不到的方式运行。
永远不要使用char(n)
,除非您知道自己在做什么。我只使用text
。
要插入多行,您可以将具有相同数量的元素的复合类型或两个数组的数组并行取消。展示后者:
CREATE FUNCTION insertdata(_arr1 text[], _arr2 text[])
RETURNS VOID AS
$$
INSERT INTO mahasiswa(col_name1, col_name2)
SELECT unnest(_arr1), unnest(_arr2);
$$
LANGUAGE sql STRICT;
呼叫:
SELECT insertdata ('{1234567890,0987654321}', '{Nahrun,Hartono}');
我宁愿使用plpgsql函数并检查两个数组中元素的数量是否相同以防止出错。使用array_length(arr1, 1)
...
...引入了一个不同的新变种,它可以并行接受多个数组 - 没有上述黑客的怪癖(永远不会默认为CROSS JOIN
)
INSERT INTO mahasiswa(col_name1, col_name2)
SELECT * FROM unnest(_arr1, _arr2); -- must be in FROM list