使用 REGEXP_SUBSTR 提取部分字符串
Extract part of the string using REGEXP_SUBSTR
我正在使用错误日志 table 到 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-" 模式并进行了一些提取,但我只在一定程度上成功了。
你能告诉我如何做到这一点吗?
此致。
oracle 有很多异常,并且有不同的掩码,您要对所有这些掩码进行编码吗?
您当前的正则表达式可能如下所示:
select regexp_replace('ORA-01400: cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")'
,'^ORA-\d+:\s(.+)\(.+\.\"(.+)\"\)', ' ') from dual
编辑: 正则表达式的描述 '^ORA-\d+:\s(.+)(.+.\"(.+)\")'
- "^" - 字符串的开头
- "ORA-" - 简单字符串 "ORA-"
- "\d+" - 数字系列
- ":" - 简单冒号
- "\s" - 白色-space
- "(.+)" - 最长的字符串。
()
表示将被捕获为 group(\1).
- "(" - 左括号
- ".+" - 最长的字符串。
- "."- 简单点
- \" - 双引号
- (.+) - 最长的字符串。下一组 (\2)
- \" - 双引号
- )' - 右括号
第 6,8 和 11 点中的正则表达式将进行饥饿搜索,它将尝试从第一组中找出最长的字符串。这意味着“6”、“8”和“11”的长度之间是否存在一些变体。 “6”将首先选择并尽其所能,“8”将选择其次,而“11”则最少。
例如,如果您有字符串 aaaaaa
和正则表达式 (.+)(.+)
,第一组将采用 aaaaa
,第二组将采用 a
如果您只需要删除错误代码,可以使用比正则表达式更快的正则 instr
和 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")
我正在使用错误日志 table 到 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-" 模式并进行了一些提取,但我只在一定程度上成功了。 你能告诉我如何做到这一点吗?
此致。
oracle 有很多异常,并且有不同的掩码,您要对所有这些掩码进行编码吗?
您当前的正则表达式可能如下所示:
select regexp_replace('ORA-01400: cannot insert NULL into ("ABC_OWNER"."ABC_PART"."REGION")'
,'^ORA-\d+:\s(.+)\(.+\.\"(.+)\"\)', ' ') from dual
编辑: 正则表达式的描述 '^ORA-\d+:\s(.+)(.+.\"(.+)\")'
- "^" - 字符串的开头
- "ORA-" - 简单字符串 "ORA-"
- "\d+" - 数字系列
- ":" - 简单冒号
- "\s" - 白色-space
- "(.+)" - 最长的字符串。
()
表示将被捕获为 group(\1). - "(" - 左括号
- ".+" - 最长的字符串。
- "."- 简单点
- \" - 双引号
- (.+) - 最长的字符串。下一组 (\2)
- \" - 双引号
- )' - 右括号
第 6,8 和 11 点中的正则表达式将进行饥饿搜索,它将尝试从第一组中找出最长的字符串。这意味着“6”、“8”和“11”的长度之间是否存在一些变体。 “6”将首先选择并尽其所能,“8”将选择其次,而“11”则最少。
例如,如果您有字符串 aaaaaa
和正则表达式 (.+)(.+)
,第一组将采用 aaaaa
,第二组将采用 a
如果您只需要删除错误代码,可以使用比正则表达式更快的正则 instr
和 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")