0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SQL】例外処理

Posted at

例外処理

例外の種類

  • 事前定義例外: ORACLEが事前に定義している一般的なエラー(例: ZERO_DIVIDE, NO_DATA_FOUND)
  • ユーザー定義例外: 開発者が独自に定義するエラー

例外ハンドラ

DECLARE
    v_number NUMBER;
BEGIN
    v_number := 1 / 0; -- ここで例外が発生
EXCEPTION
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('Division by zero error!');
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('An unexpected error occurred: ' || SQLERRM);
END;

RAISE文

RAISE文は、PL/SQLのプログラム内で明示的に例外を発生させるために使用されます。RAISE文を使用することで、カスタム例外を発生させたり、事前定義された例外を再度発生させたりすることができます。

RAISE文の使い方

  1. カスタム例外の発生

    • カスタム例外を宣言し、特定の条件が満たされたときにその例外を発生させます。
  2. 事前定義された例外の再発生

    • 例外処理ブロック内で捕捉された例外を再度発生させることができます。

カスタム例外の発生

以下の例では、負の値が入力された場合にカスタム例外を発生させます。

DECLARE
    v_number NUMBER := -1; -- 負の値を初期化
    e_negative_number EXCEPTION; -- カスタム例外を宣言
BEGIN
    -- 負の値が入力された場合にカスタム例外を発生させる
    IF v_number < 0 THEN
        RAISE e_negative_number;
    END IF;
EXCEPTION
    -- カスタム例外を処理する
    WHEN e_negative_number THEN
        DBMS_OUTPUT.PUT_LINE('Error: Negative number is not allowed.');
END;

事前定義された例外の再発生

以下の例では、事前定義された例外を捕捉し、再度発生させます。

DECLARE
    v_number NUMBER := 10;
    v_result NUMBER;
BEGIN
    BEGIN
        -- 0による除算を試みる
        v_result := v_number / 0;
    EXCEPTION
        WHEN ZERO_DIVIDE THEN
            DBMS_OUTPUT.PUT_LINE('Caught an exception: Division by zero.');
            RAISE; -- 例外を再度発生させる
    END;
EXCEPTION
    -- 再度発生した例外を処理する
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('Re-raised exception: Division by zero.');
END;

RAISE_APPLICATION_ERRORプロシージャ

RAISE_APPLICATION_ERRORプロシージャは、ユーザー定義のエラーメッセージを生成するために使用されます。このプロシージャを使用すると、特定のエラー番号とメッセージを指定して例外を発生させることができます。

例: RAISE_APPLICATION_ERRORの使用

DECLARE
    v_number NUMBER := -1;
BEGIN
    -- 負の値が入力された場合にユーザー定義の例外を発生させる
    IF v_number < 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Negative number is not allowed.');
    END IF;
EXCEPTION
    -- ユーザー定義の例外を処理する
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

ベストプラクティス

  • 例外処理は簡潔に、エラーの特定と対応を明確に行う。
  • 不要な例外処理を避け、必要な部分にのみ例外ハンドラを設ける。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?