0

以下に示すように、pl/sqlプロシージャがあります

CREATE OR REPLACE PROCEDURE add_affectedCircle
(v_affected_circle IN v_circle.circle_code%type)
IS
    v_circle_id  NUMBER;

BEGIN
        v_circle_id := get_circleID(v_affected_circle);
        INSERT INTO vf_affected_circle (affected_circle) 
        values (v_circle_id);

EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20101, 'Problem in loading Affected Circle data');
END;
/

最初に、特定のデータ v_affected_circle が vf_circle テーブルの circle_code 列で利用可能であることを get_circleID 関数を使用して確認し、circle_code に関連付けられた circle_id を返しました。

CREATE OR REPLACE FUNCTION get_circleID 
( v_circle_code  vf_circle.circle_code%TYPE)
RETURN vf_circle.circle_id%TYPE
IS
    return_value  vf_circle.circle_id%TYPE; 
BEGIN
    BEGIN
        SELECT circle_id INTO return_value
        FROM vf_circle
        WHERE circle_code = v_circle_code;
   END;
   RETURN return_value;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20102, 'Circle Code is wrong or not available');
END get_circleID;
/

提供されたデータv_affected_circle に対してデータが利用できない場合、関数get_circleIDでユーザー例外(-20102、「サークル コードが間違っているか、レコードと同じではありません」)を発生させようとしています。この関数は、プロシージャ add_affectedCircle から呼び出されます

特定のテーブル vf_affected_circle に(-20102, 'Problem in loading Affected Circle data')としてデータをロードする際に問題が発生した場合、別のユーザー例外を発生させようとしています。

問題は、プロシージャadd_affectedCircleを間違った値で実行しようとしたことです。関数からではなく、プロシージャからのみ例外が発生しています。また、処理および抑制できない他の例外が発生しています。

今、私はこのような例外を受けています

BEGIN add_affectedCircle(69,'ODI:ASA'); END;

*
ERROR at line 1:
ORA-20102: Problem in loading Affected Circle data
ORA-06512: at "SRUSER.ADD_AFFECTEDCIRCLE", line 28
ORA-06512: at line 1

しかし、私が示す必要があるのはこのようなものです

   ORA-20102: Circle Code is wrong or not available
   ORA-20101: Problem in loading Affected Circle data

どうすればこれを達成できますか?

4

1 に答える 1

4

このRAISE_APPLICATION_ERRORプロシージャには、例外が現在の例外スタックを置き換えるか (デフォルトの動作)、追加するかを制御する 3 番目のパラメーターがあります。

TRUE を指定すると、PL/SQL は error_code をエラー スタックの一番上に置きます。それ以外の場合、PL/SQL はエラー スタックを error_code に置き換えます。

したがって、それを渡すとTRUE、両方のメッセージが表示されます。プロシージャからの呼び出しで:

...
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20101, 'Problem in loading Affected Circle data',
  TRUE);
END;

出力が得られます:

BEGIN
*
ERROR at line 1:
ORA-20101: Problem in loading Affected Circle data
ORA-06512: at "SRUSER.ADD_AFFECTEDCIRCLE", line 13
ORA-20102: Circle Code is wrong or not available
ORA-06512: at line 2

スタックを操作する必要がある他のスタック情報ではなく、メッセージのみを表示するには。この記事では、興味のある情報を抽出するために使用する方法について触れてformat_error_backtraceいますが、残念ながらBTパッケージへのリンクは無効になっています。同じ地面のいくつかはここで覆われています。基本的に、例外文字列を行に解析し、で始まるものだけを表示する必要があるORA-20%と思います。

ただし、実際に重要な情報を失うことに注意してください。特に、探している特定のエラーのみをトラップすることをお勧めします。OTHERS予期しないエラーに対処し、重要なものを隠さないように、そのままにしておくことをお勧めします。

于 2013-08-05T10:47:10.433 に答える