Top > PLSQL プログラミング入門(1) > PLSQL 例外発生時にも戻り値を渡す方法
PL/SQL で例外発生させながら戻り値も渡す
CREATE OR REPLACE PROCEDURE RIVUS.EXCEPTION_TEST(P_DUMMY OUT NUMBER) IS eDummy EXCEPTION; BEGIN P_DUMMY := 1; RAISE eDummy; END; / ---- SQL> DECLARE vNum NUMBER := 9999; BEGIN EXCEPTION_TEST(vNum); DBMS_OUTPUT.PUT_LINE('処理の結果=' || vNum); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('例外処理の結果=' || vNum); END; / 例外処理の結果=9999 ← 以前の値が残ったままになる(初期化もされない) PL/SQLプロシージャが正常に完了しました。 例外をスロー (RAISE) しながら戻り値を渡すには
CREATE OR REPLACE PROCEDURE RIVUS.EXCEPTION_TEST2(P_DUMMY OUT NOCOPY NUMBER) -- NOCOPY オプションで戻り値の変数エリアに直接値を設定できる ↑↑↑ IS eDummy EXCEPTION; BEGIN P_DUMMY := 1; RAISE eDummy; END; / ---- SQL> DECLARE vNum NUMBER := 9999; BEGIN EXCEPTION_TEST2(vNum); DBMS_OUTPUT.PUT_LINE('処理の結果=' || vNum); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('例外処理の結果=' || vNum); END; / 例外処理の結果=1 ← 例外が発生しても値の代入は取り消されない。 PL/SQLプロシージャが正常に完了しました。
CREATE OR REPLACE FUNCTION RIVUS.EXCEPTION_TEST3(P_DUMMY OUT NOCOPY NUMBER) -- NOCOPY オプションで戻り値の変数エリアに直接値を設定できる ↑↑↑ RETURN NUMBER IS eDummy EXCEPTION; BEGIN P_DUMMY := 1; RAISE eDummy; RETURN 1; -- ← ここは実行されることはない END; / DECLARE vNum1 NUMBER := 9999; vNum2 NUMBER := 9999; BEGIN vNum1 := EXCEPTION_TEST3(vNum2); DBMS_OUTPUT.PUT_LINE('処理の結果=' || vNum1); DBMS_OUTPUT.PUT_LINE('処理の結果=' || vNum2); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('例外処理の結果=' || vNum1); DBMS_OUTPUT.PUT_LINE('例外処理の結果=' || vNum2); END; / 例外処理の結果=9999 例外処理の結果=1
PL/SQLの例外処理に関連する内容 |