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

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 に答える
3

PostgreSQL 9.1以降、配列スライスをループする組み込みの方法もあります。

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

一致する配列x型が必要な場所と...

SLICE値は、配列の次元数以下の整数定数である必要があります

1次元配列の場合は、そのSLICE部分を省略するだけxで、質問に表示するような単純なタイプにすることができます。

于 2013-03-15T01:56:16.870 に答える
0

1つ追加したいのですが、それは、配列のすべてのレベルをネスト解除することです。

select * from unnest(ARRAY[ARRAY[1,2,3],Array[5,6,7]]);
 unnest 
--------
      1
      2
      3
      5
      6
      7
(6 rows)

多次元配列の1つのレベルをループする場合は、代わりに次のレベルをループする必要があります。

    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 に答える