2

我想在循环时将一些记录插入表中。记录作为 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"

有谁知道为什么以及如何解决这个问题?

4

3 回答 3

3

从 PostgreSQL 9.1 开始,还有一种内置的方法可以遍历数组切片

FOREACH x SLICE 1 IN ARRAY $1
LOOP
   RAISE NOTICE 'row = %', x;
END LOOP;

wherex必须是匹配的数组类型并且...

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

对于一维数组,只需省略该SLICE部分,并且x可以是您在问题中显示的简单类型。

于 2013-03-15T01:56:16.870 回答
3

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

CREATE FUNCTION a(tab varchar[]) RETURNS void AS
$$
DECLARE 
  b varchar(20);
BEGIN
  FOR b IN SELECT unnest(tab)
  LOOP
    INSERT INTO x(c) VALUES (b);
  END LOOP;
  RETURN;
END;
$$ LANGUAGE plpgsql;
于 2013-03-13T11:29:15.420 回答
0

我想添加一件事,那就是 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;
于 2013-03-13T13:12:54.770 回答