2

いくつかの行を別のテーブルに挿入して、2 つのテーブルを更新しようとしています。しかし、私がこのようなことをしようとすると:

BEGIN
    FOR id IN (SELECT id FROM table1) LOOP
     PERFORM (INSERT INTO anothertable VALUES(id));
    END LOOP;
END;

理由がわからないエラーが発生します。syntax error at or near "INTO".

カーソルやそのような更新を1つずつ行わずに、そのようなことを行うことさえ可能ですか?

4

2 に答える 2

4

これは、不適切な PERFORM の使用と不適切な plpgsql プログラミング スタイルの例です。そこで PERFORM を使用してはなりません。そこでは括弧を使用しないでください (PL/pgSQL は C ではなく ADA 言語に基づいています!)。いくつかの正しいパターンは次のとおりです。

FOR _id IN 
          SELECT s.id 
             FROM sometab s
LOOP
  INSERT INTO othertab(id) VALUES(_id);
END LOOP;

またはより速い(そしてより短い)パターン

INSERT INTO othertab(id)
   SELECT id 
       FROM other tab

修飾名とプレフィックスを使用して、SQL 識別子と PL/pgSQL 変数の間の競合のリスクを減らしました。

注: PERFORM は、結果処理なしの SELECT ステートメントとして実装されます。したがって、ステートメントは SELECT (INSERT INTO tab ...) であり、現在サポートされていない機能です。

于 2013-10-27T12:21:47.260 に答える
1

次のように挿入してみませんか。

insert into anothertable
select id from table
于 2013-10-27T11:39:45.327 に答える