1

こんにちは、ORACLE で例外がスローされたオブジェクト (テーブルや列など) をキャプチャする方法はありますか?

例外が発生したテーブルとフィールドの名前をユーザーに示すエラー メッセージをカスタマイズするには、オブジェクト名を決定する必要があります。

変数 SQLCODE と SQLERRM があることは知っていますが、エラー オブジェクトの名前を返す追加の変数または関数があるかどうか疑問に思います。

私はこのようなものが欲しい

exception
  when others then
    begin
     if SQLCODE = -20010
       then dbms_output.put_line('The Value Too Large in the field ' || GetObjectNameError);
     end if;
   end;

アップデート

トニーの例を使用して

CREATE TABLE t (v varchar2(3));
COMMENT ON TABLE t IS 'my table description';
COMMENT ON COLUMN t.v IS 'my column description';
insert into t values ('xxxx');

実際にこのエラーを発生させます*

ERROR at line 1:
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3)

こういうの見せたい

ORA-12899: value too large for column "my column description" in table "my table description" (actual: 4, maximum: 3)

前もって感謝します。

4

3 に答える 3

2

いいえ、ありません。しかし、Oracle の最近のバージョン (少なくとも 10G) は、独自の例外を除いてそれを行います。

SQL> create table t (v varchar2(3));

Table created.

SQL> insert into t values ('xxxx');
insert into t values ('xxxx')
                      *
ERROR at line 1:
ORA-12899: value too large for column "MYSCHEMA"."T"."V" (actual: 4, maximum: 3)

探しているものを取得するには、このエラーを解析してテーブルと列の名前 (この例では T と V) を取得し、USER_TAB_COMMENTS と USER_COL_COMMENTS からコメントを検索し、それらを使用してメッセージを再構築します。

于 2009-12-18T13:53:28.673 に答える
2

いいえ。

raise_application_exception() では、エラー コードと 1 つのテキスト メッセージの 2 つの項目が許可されます。独自の例外をスローしている場合は、メッセージをフォーマットしてこの情報を含め、解析することができます。

別の方法は、この情報をグローバルな「ERROR TABLE」に入れ、例外を発生させることです。

以下のコメントのフォローアップとして、Oracle 10G には以下が含まれます。

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

これにより、発生した複数のエラーを解析できます。このブログ投稿では、この情報を解析して、コール スタックからより多くのより適切な情報を抽出する方法を示します。ただし、独自のエラー メッセージを含めるのではなく、エラー メッセージを解析する必要があります。

于 2009-12-18T13:54:55.893 に答える
1

はい、できますが、ソース コードの場所のみです。チェックアウトしDbms_Utility.Format_Error_Stack()Dbms_Utility.Format_Call_Stack().

エラーが発生した PL/SQL の部分の行番号とオブジェクト名を含む文字列を取得します。

于 2009-12-18T14:32:31.917 に答える