Postgresql 循环时插入

Postgresql 循环时插入,postgresql,loops,plpgsql,sql-insert,Postgresql,Loops,Plpgsql,Sql Insert,我想在循环时向表中插入一些记录。记录作为varchar选项卡传递给函数,即: create function a(tab varchar[]) RETURNS void AS $$ DECLARE b varchar(20); BEGIN FOREACH b IN ARRAY tab LOOP INSERT INTO....; END LOOP; RETURN; END; $$ LANGUAGE plpgsql; 但是,执行时会出现以下错误: ERROR:

我想在循环时向表中插入一些记录。记录作为varchar选项卡传递给函数,即:

create function a(tab varchar[]) RETURNS void AS
$$
DECLARE 
  b varchar(20);
BEGIN
  FOREACH b IN ARRAY tab
   LOOP
      INSERT INTO....;
   END LOOP;
  RETURN;
END;
$$
LANGUAGE plpgsql;
但是,执行时会出现以下错误:

ERROR:  syntax error at or near "FOREACH"
LINE 1: FOREACH  $1  IN ARRAY tab LOOP INSERT INTO x (c, ...
QUERY:  FOREACH  $1  IN ARRAY tab LOOP INSERT INTO x (c) VALUES ( $1)
CONTEXT:  SQL statement in PL/PgSQL function " near line ...

********** ERROR **********

ERROR: syntax error at or near "FOREACH"
有人知道为什么以及如何解决这个问题吗?

构造是在9.1中添加的。对于早期版本,您可以通过以下方式使用函数:

CREATE函数a(tab varchar[])返回void作为
$$
声明
b瓦尔查尔(20);
开始
对于b,请选择“取消设置”(选项卡)
环
插入x(c)值(b);
端环;
返回;
结束;
$$语言plpgsql;

我想添加一件事,那就是unnest会对数组的所有级别进行unnest:

select * from unnest(ARRAY[ARRAY[1,2,3],Array[5,6,7]]);
 unnest 
--------
      1
      2
      3
      5
      6
      7
(6 rows)
如果要循环多维数组的一个级别,则应循环以下内容

    FOR out_count IN
                    array_lower(in_transactions, 1) ..
                    array_upper(in_transactions, 1)
    LOOP
        -- Fill the bulk payments table
        INSERT INTO bulk_payments_in(id, amount)
        VALUES (in_transactions[out_count][1],
                in_transactions[out_count][2]);
    END LOOP;

自PostgreSQL 9.1以来,还有:

其中
x
必须是匹配的数组类型,并且

切片值必须是不大于数组维数的整数常量


对于一维数组,只需省略
SLICE
部分,
x
可以是一个简单的类型,就像您在问题中显示的那样。

哪个版本的Postgres
FOREACH IN ARRAY
似乎是在9.1中添加的。请始终提供您正在使用的版本号。这是一个程序员的网站,你应该知道怎么做。另外,如果您提供了一个完整的示例,那么很可能根本不需要循环,这样会更快。PostgreSQL 9.1+为此提供了一个专用功能。
FOREACH x SLICE 1 IN ARRAY $1
LOOP
   RAISE NOTICE 'row = %', x;
END LOOP;