3つの挿入ステートメントを使用していますが、3番目のステートメントにエラーがある場合は、1番目と2番目のステートメントをロールバックします。これを行う方法がない場合は、PostgresqQLでこれを処理する別のアプローチを教えてください。
COMMIT
またはROLLBACK
を使用すると、エラーが発生します。
CREATE OR REPLACE FUNCTION TEST1 ()
RETURNS VOID
LANGUAGE 'plpgsql'
AS $$
BEGIN
INSERT INTO table1 VALUES (1);
INSERT INTO table1 VALUES (2);
INSERT INTO table1 VALUES ('A');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;$$;
上記のコードは機能していません。 COMMIT
およびROLLBACK
は、PostgreSQL関数ではサポートされていません。
関数では、SAVEPOINT
、COMMIT
、_ROLLBACK
などのトランザクションステートメントを使用できません。
PL/pgSQLでブロックを開始するBEGIN
は、トランザクションを開始するSQLステートメントBEGIN
とは異なります。
関数からCOMMIT
を削除するだけで解決できます。関数全体が常に単一のトランザクション内で実行されるため、3番目のステートメントでエラーが発生すると、ROLLBACK
が元に戻ります最初の2つのステートメント。