最小限の例は次のとおりです。
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
行う場合:
SELECT raise_exception
FROM DUAL;
NULL
を含む単一の行を取得します 値-
その後、次のようにフォローアップしました:
したがって、関数で例外が発生し、SQLクライアントはこれを認識して、NULL
であるデータがないためこれを解釈します。 値を設定し、例外を「処理」します。
だから
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
DUAL
として成功します テーブルには単一の行があり、関数からの例外は(サイレントに)処理され、変数にはNULL
が含まれることになります。 値。
ただし、
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
例外は、今回は関数からPL / SQLスコープに渡されます-エラーを処理せず、例外ハンドラブロック(存在しない)に例外を渡すため、アプリケーションスコープに渡されて実行が終了しますプログラムの。
そしてトムに尋ねる:
ここで、関数を変更して別の例外を発生させた場合:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
次に両方:
SELECT raise_exception
FROM DUAL;
および:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
例外を処理してORA-01476 divisor is equal to zero
で終了する方法がわからない 。