使用REGEXP_SUBSTR提取字符串的一部分

时间:2016-10-25 12:51:13

标签: oracle regexp-substr

我正在使用错误日志表通过dbms_errlog.create_error_log来解决DML操作错误'将ORA_ERR_MESG $返回给客户端。但是我需要忽略错误代码,因此它看起来用户友好。

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

这需要更改为"无法将NULL插入REGION"

我已经尝试过REGEXP_SUBSTR来搜索" ORA - "模式与做一些提取,但我在一定程度上取得了成功。 你能告诉你如何做到这一点。

问候。

2 个答案:

答案 0 :(得分:1)

o oracle有很多异常,并且有不同的掩码你想要编码所有这些吗?

你当前的regexp可能看起来像:

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

编辑: regexp的描述'^ ORA- \ d +:\ s(。+)(。+。\“(。+)\”)'

  1. “^” - 字符串的开头
  2. “ORA-” - 简单的字符串“ORA - ”
  3. “\ d +” - 数字系列
  4. “:” - 简单冒号
  5. “\ s” - white-space
  6. “(。+)” - 任何字符的最长字符串。并且()表示将被捕获为组(\ 1)。
  7. “(” - 左括号
  8. “。+” - 任何字符中最长的字符串。
  9. “。” - 简单的点
  10. \“ - 双引号
  11. (。+) - 任何字符的最长字符串。下一组(\ 2)
  12. \“ - 双引号
  13. )' - 右括号
  14. 在第6,8和11点的正则表达式将是饥饿的搜索它将尝试罚款第一组中最长的字符串。这意味着如果在“6”,“8”和“11”的长度之间存在一些变体。 “6”将首先选择并采取它可以“8”选择下一个和“11”最少的所有。 例如,如果您有字符串aaaaaa和正则表达式(.+)(.+),则第一组将采用aaaaa,第二组采用a

答案 1 :(得分:0)

如果您只是需要删除错误代码,可以使用常规instrsubstr来完成,这比正则表达式更快。但这取决于你真正需要做的事情(例如,在这里我没有打扰首字母大写,因为无论如何你的要求很可能会被澄清)。

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")