0

dbms_errlog.create_error_log を介してエラー ログ テーブルを使用して、DML 操作エラーを一括で処理し、ORA_ERR_MESG$ をクライアントに返します。ただし、エラーコードを無視する必要があるため、ユーザーフレンドリーに見えます。

例: ORA-01400: ("ABC_OWNER"."ABC_PART"."REGION") に NULL を挿入できません

これを「REGION に NULL を挿入できません」に変更する必要があります。

REGEXP_SUBSTR を試して「ORA-」パターンを検索し、抽出を行いましたが、ある程度しか成功しませんでした。これを行う方法についてアドバイスをお願いします。

よろしく。

4

2 に答える 2

1

オラクルには多くの例外があり、さまざまなマスクがありますが、それらすべてをコーディングしますか?

現在の正規表現は次のようになります。

select regexp_replace('ORA-01400: cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")'
                     ,'^ORA-\d+:\s(.+)\(.+\.\"(.+)\"\)', '\1 \2') from dual

編集:正規表現 '^ORA-\d+:\s(.+)(.+.\"(.+)\")' の説明

  1. "^" - 文字列の始まり
  2. "ORA-" - 単純な文字列 "ORA-"
  3. "\d+" - 一連の数字
  4. ":" - 単純なコロン
  5. "\s" - 空白
  6. "(.+)" - 任意の文字の中で最も長い文字列。()つまり、グループ (\1) としてキャプチャされます。
  7. "(" - 左ブラケット
  8. ".+" - 任意の文字の中で最も長い文字列。
  9. "."-単純なドット
  10. \" - 二重引用符
  11. (.+) - 任意の文字の中で最も長い文字列。そして次のグループ (\2)
  12. \" - 二重引用符
  13. )' - 右ブラケット

ポイント 6、8、および 11 の Regexp は空腹の検索になり、最初のグループから最長の文字列を見つけようとします。「6」、「8」、「11」の長さの間にいくつかのバリエーションがあるかどうかを意味します。「6」は最初に選択し、「8」は次に選択し、「11」は最小を選択します。たとえば、文字列aaaaaaと正規表現がある場合(.+)(.+)、最初のグループが取得aaaaaし、2 番目のグループが取得されますa

于 2016-10-25T13:08:24.947 に答える