如何使用PostgreSQL中的函数插入多行

nah*_*run 5 postgresql function plpgsql sql-insert postgresql-9.3

我想在PostgreSQL中的函数表中插入多行.

这是我的桌子

CREATE TABLE mahasiswa
(
  nim CHAR(10),
  nama VACHAR(40)
  CONSTRAINT pk_nim PRIMARY KEY (nim)
)
;
Run Code Online (Sandbox Code Playgroud)

这就是我创造的功能

CREATE FUNCTION insertdata(CHAR(10),varchar(40)) 
       RETURNS VOID AS 
       $$ 
         INSERT INTO mahasiswa VALUES ($1,$2); 
       $$ 
       LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)

当我这样调用函数时

SELECT insertdata ('1234567890','Nahrun'),
('0987654321','Hartono');
Run Code Online (Sandbox Code Playgroud)

只插入一行.

如何修改我的函数以一次插入多行?

Erw*_*ter 11

应该具备功能是:

CREATE FUNCTION insertdata(varchar(10),varchar(40)) 
  RETURNS VOID AS 
$$ 
   INSERT INTO mahasiswa(col_name1, col_name2)
   VALUES ($1,$2); 
$$ 
LANGUAGE sql STRICT;
Run Code Online (Sandbox Code Playgroud)
  • 不要引用语言名称.这是一个标识符.

  • 始终提供带有持久语句的目标列表.否则,如果稍后更改表定义,则该函数可能会以意外的方式运行.

  • 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;
Run Code Online (Sandbox Code Playgroud)

呼叫:

SELECT insertdata ('{1234567890,0987654321}', '{Nahrun,Hartono}');
Run Code Online (Sandbox Code Playgroud)

我宁愿使用plpgsql函数并检查两个数组中的元素数量是否相同以防止出错.用array_length(arr1, 1)...

Postgres 9.4或更高版本......

...引入了一个不同的新变种,可以并行接受多个数组 - 没有上述黑客的怪癖(从不默认为a CROSS JOIN)

   INSERT INTO mahasiswa(col_name1, col_name2)
   SELECT * FROM unnest(_arr1, _arr2);  -- must be in FROM list
Run Code Online (Sandbox Code Playgroud)

  • 注意:在最后一个 PG 9.4 INSERT 示例中,当与多个数组一起使用时,需要“SELECT * FROM unnest(...”,否则 pg 会报告不匹配的函数错误。 (2认同)