- - PR -
パッケージの実行時エラー時に戻り値を正常に取得できない
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-07-24 18:03
いつもお世話になります。
パッケージの実行時エラー時に戻り値を正常に取得できておりません。 パッケージ自体は以下のような内容となります。 CREATE OR REPLACE package BODY PKG_HOGEHOGE is procedure HOGE01(PARA_WSID IN VARCHAR2, -- 端末ID USERNAME IN VARCHAR2, -- ユーザID TOKU_CD IN VARCHAR2, -- 締処理得意先コード Ret OUT NUMBER -- 戻り値 ) is -- 変数の定義 wk_Ret number(2); BEGIN wk_Ret := 10; --戻り値を「10」で初期化 wk_Ret := SUB01(PARA_WSID, --SUB01 Function 呼び出し USERNAME, TOKU_CD ); wk_Ret := SUB02(PARA_WSID, --SUB02 Function 呼び出し USERNAME, TOKU_CD ); wk_Ret := SUB03(PARA_WSID, --SUB03 Function 呼び出し USERNAME, TOKU_CD ); EXCEPTION WHEN OTHERS THEN Ret := wk_Ret; END HOGE01; 〜中略〜 END PKG_HOGEHOGE; / パッケージのメインプロシージャとなる「HOGE01」から各SUBファンクションを 呼び出しております。 各サブファンクションは最後に以下の記述を持っており、 ----- RETURN 0; --正常時は0を返す EXCEPTION WHEN OTHERS THEN RETURN 3; --エラー時は3を返す END SUB03; --- 正常時には「0」を、エラー発生時にはエラー用の戻り値を返すようにしております。 ところがSUB02でエラーが発生しても(例:Insert対象のカラムオーバフローなど) パッケージ自体の戻り値は何があっても「0」と帰ってきてしまいます。 上記パッケージのどこが悪くてそうなってしまっているのでしょうか、 どなたかご添削の程よろしくお願いいたします。 | ||||
|
投稿日時: 2008-07-25 00:14
どのように実行して確認したのでしょうか?
| ||||
|
投稿日時: 2008-07-25 10:39
SUB02からはどうやって復帰しているのですか? もしRETURN 3で復帰しているのであれば、EXCEPTIONブロックには飛ばず、SUB03の実行に進んでしまいますね。 もしEXCEPTIONで復帰しているのであれば、wk_RetはSUB01の返り値を持ったままEXCEPTIONブロックに飛んでしまいます。 | ||||
|
投稿日時: 2008-07-25 23:05
解析ありがとうございました。
まずはdeanna様への返答です。 SUB01実行後にはSUB01が作るはずのデータが作成されているが、 SUB02で作成するデータができておらず、またSUB03で作成される データは作成されており、そのときの戻り値が「0」でした。 また推測を元にSUB02を調査したところ、Insert文の特定NUMBERカラムに VARCHAR2のデータ型を挿入しようとしていることがわかり、 それを修正したらSUB02のデータも作成されるようになった、 という次第であります。 カーニー様、 SUB02でエラー発生時はRETURN3を元のプロシージャに戻しております。 これでは元プロシージャ側でExceptionは拾わないでしょうか、 自分でも記述していてこれで拾ってくれるのか少し疑問でしたが。 例外処理に「raise」文を入れてみたところまあ何とか処理は続行せずに エラーを返してきたのでこれでよしとさせていただきました。 いつもながら本当にありがとうございました。 | ||||
|
投稿日時: 2008-07-28 14:08
エラーハンドリングに例外を利用するか、返り値を利用するかは通常どちらか一方で、例示されたような形での併用というのはちょっと無理があるというか、無駄がありませんでしょうか。
返り値を使うのであれば、SUB02をコールした直後に、 IF wk_Ret != 0 THEN ・・・ のようにエラーチェックしないといけませんよね。 |
1