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

PL / SQL例外処理:何もしません(例外を無視します)

    99%の場合、少なくともどこかにログを記録せずに例外を黙って無視することは悪い習慣であることに同意しますが、これが完全に受け入れられる特定の状況があります。

    このような状況では、NULLがあなたの友達です:

    [...]
    EXCEPTION
    
        WHEN OTHERS THEN
            NULL;
    END;
    

    例外を無視することが望ましい2つの典型的な状況は次のとおりです。

    1)コードに、ときどき失敗することがわかっているステートメントが含まれていて、この事実によってプログラムフローが中断されないようにする必要があります。この場合、次の例に示すように、ステートメントをネストされたブロックで囲む必要があります。

    >
    CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
    IS
        l_empoyee_name  EMPLOYEES.EMPLOYEE_NAME%TYPE;
    BEGIN
        -- Catch potential NO_DATA_FOUND exception and continue
        BEGIN 
            SELECT EMPLOYEE_NAME
            INTO l_empoyee_name
            FROM EMPLOYEES
            WHERE EMPLOYEE_ID = 12345;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                NULL;
            WHEN OTHERS THEN
                RAISE;
        END;
    
        do_stuff();
    
    EXCEPTION
    
        WHEN OTHERS THEN
            -- Propagate exception
            RAISE;
    END;
    

    PL / SQLは通常、VisualBasicで知られているOnErrorResume Nextタイプの例外処理を許可しないことに注意してください。この場合、すべての例外は無視され、プログラムは何も起こらなかったかのように実行され続けます(エラーが発生すると、PLで次のタイプのエラー処理が再開されます/ SQL oracle )。失敗する可能性のあるステートメントをネストされたブロックで明示的に囲む必要があります。

    2)プロシージャは非常に重要ではないため、スローされるすべての例外を無視しても、メインプログラムのロジックには影響しません。 (ただし、これは非常にまれであり、長期的にはデバッグの悪夢につながる可能性があります)

    BEGIN
    
        do_stuff();
    
    EXCEPTION
    
        WHEN OTHERS THEN
            -- Ignore all exceptions and return control to calling block
            NULL;
    END;
    


    1. RANK()を使用してSQLの行のランキング位置を追加する方法

    2. n番目の行をn+1番目の行と比較し、それがn番目の行の範囲内にある場合はn+1行を出力しますUSNGORACLEQUERY

    3. Rails-複数の関係にわたってデータを効率的にプルして計算します

    4. SQLServerExpressエディションでジョブを作成する方法