質問するログイン新規登録
PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

1回答

255閲覧

PL/SQL 呼び出したファンクション処理でのエラーを、呼び出し元の指定した例外ブロックに飛ばしたい。

WHdfghjk

総合スコア12

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2023/07/26 05:08

編集2023/07/26 05:10

0

0

実現したいこと

プロシージャー「test_pro」から呼び出したファンクション「test_fun」を呼び出しており、
ファンクション「test_fun」内でパラメーターエラーを発生させることができております。
現在上記エラーが発生した際、呼び出し元プロシージャー「test_pro」内の例外処理「WHEN OTHERS THEN(14行目)」の方に飛びます。
これをプロシージャー「test_pro」にある「WHEN parameter_err THEN(12行目)」内に処理が飛ぶようにしたいのです。
以下「試したこと」欄②にORACLE例外コード-20001を使用した際の成功例は記載しておりますが、
例外コード-20001などを使わない方法を求めております。

発生している問題・エラーメッセージ

ファンクション「test_fun」内でパラメーターエラーを発生させ、
呼び出し元プロシージャー「test_pro」内の例外処理「WHEN OTHERS THEN(14行目)」の方に飛んでしまう。

該当のソースコード

PL/SQL プロシージャー

1PROCEDURE test_pro( 2 o_return_cd OUT VARCHAR2 -- リターンコード 3) 4IS 5 err_arg1 VARCHAR2(1024); -- エラーメッセージ1 6 err_arg2 VARCHAR2(1024); -- エラーメッセージ2 7 parameter_err EXCEPTION; -- 例外:パラメータエラー 8 result VARCHAR2(14); -- 結果を格納する変数 9BEGIN 10 result := test_fun('T', NULL); 11EXCEPTION 12 WHEN parameter_err THEN 13 DBMS_OUTPUT.PUT_LINE('引数エラー: '); 14 WHEN OTHERS THEN 15 DBMS_OUTPUT.PUT_LINE('その他エラー'); 16END;

PL/SQL ファンクション

1FUNCTION test_fun( 2 i_no testTable.test_NO%TYPE, -- 番号 3 i_hiduke DATE -- 日付 4) RETURN testTable.test_NO%TYPE - 番号 5IS 6 err_arg1 VARCHAR2(1024); --エラーメッセージ1 7 err_arg2 VARCHAR2(1024); --エラーメッセージ2 8 parameter_err EXCEPTION; --例外:パラメータエラー 9BEGIN 10 --引数チェック 11 IF i_kijunnbi IS NULL THEN 12 err_arg1 := '日付'; 13 err_arg2 := i_hiduke; 14 RAISE parameter_err; 15 END IF; 16 return i_no; 17EXCEPTION 18 WHEN parameter_err THEN 19 RAISE; 20 WHEN OTHERS THEN 21 -- 異常終了 22 RAISE; 23END;

試したこと

①ファンクション「test_fun」の19行目を「RAISE parameter_err;」に変更して実行
→結果変わらず。

②プロシージャー「test_pro」の7行目の下に「PRAGMA EXCEPTION_INIT(parameter_err, -20001);」を追加
ファンクション「test_fun」の8行目の下に「PRAGMA EXCEPTION_INIT(parameter_err, -20001);」を追加
ファンクション「test_fun」の19行目を「RAISE_APPLICATION_ERROR(-20001, ‘入力パラメータが不正です’);」に変更
→プロシージャー「test_pro」にある「WHEN parameter_err THEN(12行目)」内に処理が飛ぶ(成功)

補足情報

oracle version 21.0.0.0.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2023/07/29 08:15

新たにエラー番号との紐付けをしたくないということなら、事前定義例外 (VALUE_ERRORなんか) を使えばよいのでは。
guest

回答1

0

RAISE_APPLICATION_ERROR ユーザー指定のエラーコードとエラーメッセージの生成 を熟読してください。

FUNCTIONを呼ぶ方でのEXCEPTIONで例外の判断も必要です。

投稿2023/09/17 08:38

Orlofsky

総合スコア16419

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問