0

我通过 dbms_errlog.create_error_log 使用错误日志表来批量处理 DML 操作错误并将 ORA_ERR_MESG$ 返回给客户端。但是我需要忽略错误代码,所以它看起来对用户友好。

例如:ORA-01400:无法将 NULL 插入 ("ABC_OWNER"."ABC_PART"."REGION")

这需要更改为“Cannot insert NULL into REGION”

我已经尝试 REGEXP_SUBSTR 来搜索“ORA-”模式并进行一些提取,但我只在一定程度上成功了。你能否就如何做到这一点提出建议。

问候。

4

2 回答 2

1

oracle 有很多例外,并且有不同的掩码您要对所有掩码进行编码吗?

您当前的正则表达式可能看起来像:

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 点中的正则表达式将是饥饿搜索,它将尝试对第一组中最长的字符串进行罚款。这意味着“6”、“8”和“11”的长度之间是否存在一些变体。“6”将首先选择并尽其所能“8”将选择其次,“11”最少。例如,如果您有字符串aaaaaa和正则表达式(.+)(.+),则第一组将采用aaaaa第二组a

于 2016-10-25T13:08:24.947 回答
0

如果您只需要删除错误代码,可以使用正则instrand来完成substr,这比正则表达式更快。但这取决于您真正需要做什么(例如,在这里我没有费心将第一个字母大写,因为无论如何您的要求可能会在以后得到更多澄清)。

with
     error_messages ( str ) as (
       select 'ORA-01400: cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")' 
         from dual
     )
select substr( str, instr(str, ' ') + 1) as modified_err_msg from error_messages
;

MODIFIED_ERR_MSG
----------------
cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")
于 2016-10-25T13:16:47.040 回答