- PR -

パッケージの実行時エラー時に戻り値を正常に取得できない

1
投稿者投稿内容
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 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」と帰ってきてしまいます。

上記パッケージのどこが悪くてそうなってしまっているのでしょうか、
どなたかご添削の程よろしくお願いいたします。
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2008-07-25 00:14
どのように実行して確認したのでしょうか?
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-07-25 10:39
引用:

コウジさんの書き込み (2008-07-24 18:03) より:
ところがSUB02でエラーが発生しても(例:Insert対象のカラムオーバフローなど)
パッケージ自体の戻り値は何があっても「0」と帰ってきてしまいます。


SUB02からはどうやって復帰しているのですか?

もしRETURN 3で復帰しているのであれば、EXCEPTIONブロックには飛ばず、SUB03の実行に進んでしまいますね。

もしEXCEPTIONで復帰しているのであれば、wk_RetはSUB01の返り値を持ったままEXCEPTIONブロックに飛んでしまいます。
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 2008-07-25 23:05
解析ありがとうございました。

まずはdeanna様への返答です。
SUB01実行後にはSUB01が作るはずのデータが作成されているが、
SUB02で作成するデータができておらず、またSUB03で作成される
データは作成されており、そのときの戻り値が「0」でした。
また推測を元にSUB02を調査したところ、Insert文の特定NUMBERカラムに
VARCHAR2のデータ型を挿入しようとしていることがわかり、
それを修正したらSUB02のデータも作成されるようになった、
という次第であります。

カーニー様、
SUB02でエラー発生時はRETURN3を元のプロシージャに戻しております。
これでは元プロシージャ側でExceptionは拾わないでしょうか、
自分でも記述していてこれで拾ってくれるのか少し疑問でしたが。

例外処理に「raise」文を入れてみたところまあ何とか処理は続行せずに
エラーを返してきたのでこれでよしとさせていただきました。

いつもながら本当にありがとうございました。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-07-28 14:08
エラーハンドリングに例外を利用するか、返り値を利用するかは通常どちらか一方で、例示されたような形での併用というのはちょっと無理があるというか、無駄がありませんでしょうか。

返り値を使うのであれば、SUB02をコールした直後に、

IF wk_Ret != 0 THEN ・・・

のようにエラーチェックしないといけませんよね。
1

スキルアップ/キャリアアップ(JOB@IT)