plpgsqlの関数 トランザクション内で自動的に実行されます。それはすべて成功するか、すべて失敗します。マニュアル:
関数とトリガープロシージャは、常に外部クエリによって確立されたトランザクション内で実行されます。実行するコンテキストがないため、そのトランザクションを開始またはコミットすることはできません。ただし、
EXCEPTION
を含むブロック 句は、外部トランザクションに影響を与えることなくロールバックできるサブトランザクションを効果的に形成します。詳細については、セクション42.6.6を参照してください。
したがって、必要に応じて、理論的に発生する可能性のある例外をキャッチできます(ただし、発生する可能性はほとんどありません)。
マニュアルのエラーのトラップの詳細。
機能のレビューと簡素化:
CREATE FUNCTION foo(v_weather text
, v_timeofday text
, v_speed text
, v_behavior text)
RETURNS SETOF custombehavior
LANGUAGE plpgsql AS
$func$
BEGIN
DELETE FROM custombehavior
WHERE weather = 'RAIN'
AND timeofday = 'NIGHT'
AND speed = '45MPH';
INSERT INTO custombehavior (weather, timeofday, speed, behavior)
SELECT v_weather, v_timeofday, v_speed, v_behavior
WHERE NOT EXISTS (
SELECT FROM defaultbehavior
WHERE a = 'RAIN'
AND b = 'NIGHT'
AND c = '45MPH'
);
RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;
END
$func$;
実際にトランザクションの開始/終了が必要な場合 タイトルに示されているように、SQLの手順 Postgres 11以降( CREATE PROCEDURE
)。参照:
- PostgreSQLでは、「ストアドプロシージャ」と他のタイプの関数の違いは何ですか?