在LOOPing时插入

时间:2013-03-13 11:12:29

标签: 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:  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"

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

3 个答案:

答案 0 :(得分:3)

自PostgreSQL 9.1起,还有一个built-in way to loop through array slices

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

x必须是匹配的数组类型和...

  

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

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

答案 1 :(得分:2)

在9.1中添加了

FOREACH构造。对于早期版本,您可以通过以下方式使用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;

答案 2 :(得分:0)

我想添加一个东西,那就是不需要的东西会排除数组的所有级别:

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;