2

アプリケーションエラーをスローする手順を作成したいと思います。この手順は、別のパッケージに配置する必要があります。

procedue Raise_Error(error_code) is
err t_Error;
begin
      err:= error_list(error_code);
      raise_application_error(err.error_number, err.message);
end; 

だから私はパッケージ内にタイプを作成しました:

type t_Error is record (error_number INTEGER, message VARCHAR2(200));
type t_Error_List is table of t_Error index by VARCHAR(30);
error_list t_Error_List ;

次のようなエラー定数のリストを作成するにはどうすればよいですか:

const1 t_Error := t_Error (-200001, 'first message');
const2 t_Error := t_Error (-200002, 'second message');

error_list ('code1') := const1;
error_list ('code2') := const2;

どうもありがとう。ボブ

4

1 に答える 1

1

パッケージのbegin/endブロック (パッケージを呼び出すセッションごとに作成される場所) にエラー テーブルを作成できますが、そのようなレコードをインスタンス化することはできません。フィールド値を個別に設定する必要があります。

create package body error_pkg as
  procedure Raise_Error(error_code in varchar2) is
    err t_Error;
  begin
    err := error_list(error_code);
    raise_application_error(err.error_number, err.message);
  end Raise_Error;

begin
  error_list ('code1').error_number := -20001;
  error_list ('code1').message := 'first message';
  error_list ('code2').error_number := -20002;
  error_list ('code2').message := 'second message';
end error_pkg;
/

プロシージャをコールするダミーのPL/SQLブロックを使用:

begin
  error_pkg.raise_error('code2');
end;
/

Error report:
ORA-20002: second message
ORA-06512: at "STACKOVERFLOW.ERROR_PKG", line 6
ORA-06512: at line 2

SQL フィドルのデモ

しかし、これが良い考えかどうかはわかりません。raise_error元の問題のスタック トレースが失われています。呼び出しがどこから行われたのかわかりません。おそらく、それはあなた自身のエラーには関係ありません。ただし、実際の例外をキャッチして代わりにこれを呼び出す場合は、悪い考えです。

于 2013-06-25T10:38:07.757 に答える