web-dev-qa-db-ja.com

PostgreSQL関数でCOMMITおよびROLLBACKを使用する方法

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関数ではサポートされていません。

5
Rahul Gour

関数では、SAVEPOINTCOMMIT、_ROLLBACKなどのトランザクションステートメントを使用できません。

PL/pgSQLでブロックを開始するBEGINは、トランザクションを開始するSQLステートメントBEGINとは異なります。

関数からCOMMITを削除するだけで解決できます。関数全体が常に単一のトランザクション内で実行されるため、3番目のステートメントでエラーが発生すると、ROLLBACKが元に戻ります最初の2つのステートメント。

15
Laurenz Albe