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

PostgreSQLの例外処理

    エラーメッセージとそのコードをキャッチするには:

    do $$       
    begin
    
        create table yyy(a int);
        create table yyy(a int); -- this will cause an error
    
    exception when others then 
    
        raise notice 'The transaction is in an uncommittable state. '
                     'Transaction was rolled back';
    
        raise notice '% %', SQLERRM, SQLSTATE;
    
    end; $$ 
    language 'plpgsql';
    

    行番号がまだ見つかりません

    2019年4月16日更新

    Diego Scaravaggiが提案しているように、Postgres 9.2以降では、スタック診断を取得

    do language plpgsql $$
    declare
        v_state   TEXT;
        v_msg     TEXT;
        v_detail  TEXT;
        v_hint    TEXT;
        v_context TEXT;
    begin
    
        create table yyy(a int);
        create table yyy(a int); -- this will cause an error
    
    exception when others then 
    
        get stacked diagnostics
            v_state   = returned_sqlstate,
            v_msg     = message_text,
            v_detail  = pg_exception_detail,
            v_hint    = pg_exception_hint,
            v_context = pg_exception_context;
    
        raise notice E'Got exception:
            state  : %
            message: %
            detail : %
            hint   : %
            context: %', v_state, v_msg, v_detail, v_hint, v_context;
    
        raise notice E'Got exception:
            SQLSTATE: % 
            SQLERRM: %', SQLSTATE, SQLERRM;     
    
        raise notice '%', message_text; -- invalid. message_text is contextual to GET STACKED DIAGNOSTICS only
    
    end; $$;
    

    結果:

    NOTICE:  Got exception:
            state  : 42P07
            message: relation "yyy" already exists
            detail : 
            hint   : 
            context: SQL statement "create table yyy(a int)"
    PL/pgSQL function inline_code_block line 11 at SQL statement
    NOTICE:  Got exception:
            SQLSTATE: 42P07 
            SQLERRM: relation "yyy" already exists
    
    ERROR:  column "message_text" does not exist
    LINE 1: SELECT message_text
                   ^
    QUERY:  SELECT message_text
    CONTEXT:  PL/pgSQL function inline_code_block line 33 at RAISE
    SQL state: 42703
    

    GET STACKED DIAGNOSTICSは別として SQL標準に準拠しており、その診断変数(message_textなど) )はGSDのみに関連しています。したがって、message_textという名前のフィールドがある場合 テーブルでは、GSDがフィールドの値に干渉する可能性はありません。

    それでも行番号はありません。



    1. Oracleテーブルの列名の表示

    2. DBMS_CRYPTO関数を使用してCLOBデータを復号化中にエラーが発生しました

    3. PL / pgSQL関数に副作用があるのに、SQL関数にはないのはなぜですか?

    4. MySQL LEAST()関数–引数のリストから最小の引数を検索します