質問: 1 THEN INSERT INTO a(test1, test2) VALUES(i,1); END IF; INSERT INTO b(test3, test4) VALUES(i,j); END LOOP; END LOOP ; COMMIT; END; ' LANGUAGE plpgsql ; select testtable(); ``` このエラーが発生してしまいます ``` cannot begin/end transactions in PL/pgSQL ``` 原因がわからなくて困っています 教えてください。
回答: 関数内に`COMMIT`があるのが原因です。 エラーメッセージの通り、PostgreSQLではユーザ定義関数内でコミットやロールバックといったトランザクション制御はできません。 より: > > PL/pgSQLのBEGIN/ENDは単にまとめるためのもので、トランザクションを始めたり終わらせたりしません。 関数とトリガプロシージャは常に外側の問い合わせで確立されたトランザクションの内側で実行されます。 トランザクションの実行させる文脈はありませんので、これらはトランザクションを開始することもコミットすることもできません。 > > > PostgreSQL 11からは`CREATE PROCEDURE`文でプロシージャを作成し`CALL`で呼ぶときはできるようになるようです。