sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLはPL/pgSQLでトランザクションを開始/終了できません

    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では、「ストアドプロシージャ」と他のタイプの関数の違いは何ですか?


    1. SQL Serverのdatetimeとsmalldatetime:違いは何ですか?

    2. T-SQLで2つの日付の差を計算する方法

    3. WHERE IN...INTリストのDB.executeにパラメータを渡します

    4. MySQLとMariaDBのデータベースの高可用性の概要