Oracle 中 2 个 varchar 列(来自不同表)之间的正则表达式比较
Posted
技术标签:
【中文标题】Oracle 中 2 个 varchar 列(来自不同表)之间的正则表达式比较【英文标题】:Regex comparison in Oracle between 2 varchar columns (from different tables) 【发布时间】:2020-09-24 00:57:17 【问题描述】:我正在尝试找到一种从 oracle alertlog 中捕获相关错误的方法。我有一张表(ORA_BLACKLIST),其列值如下(这些是我想忽略的值 V$DIAG_ALERT_EXT)
以下是 ORA_BLACKLIST 表中的示例数据。该表可以根据需要从警报日志中忽略的其他错误而增长。
ORA-07445%[kkqctdrvJPPD
ORA-07445%[kxsPurgeCursor
ORA-01013%
ORA-27037%
ORA-01110
ORA-2154
V$DIAG_ALERT_EXT 包含一个 MESSAGE_TEXT 列,其中包含如下示例文本。
ORA-01013: user requested cancel of current operation
ORA-07445: exception encountered: core dump [kxtogboh()+22] [SIGSEGV] [ADDR:0x87] [PC:0x12292A56]
ORA-07445: exception encountered: core dump [java_util_HashMap__get()] [SIGSEGV]
ORA-00600: internal error code arguments: [qercoRopRowsets:anumrows]
我想写一个类似下面的查询来忽略黑名单错误,只捕获下面的相关信息。
选择 dae.instance_id, dae.container_name, 错误计数, dae.message_level 从 ORA_BLACKLIST ob, V$DIAG_ALERT_EXT dae 在哪里 按……分组;
有人可以建议一种方法或示例代码来实现它吗?
我应该提供黑名单表的确切内容。它目前包含一些正则表达式(perl),我想将它转换为像正则表达式一样的 oracle 并与 v$diag_alert_ext message_text 列进行比较。以下是我的黑名单表中的示例 perl 正则表达式。
ORA-0(,|$| ) ORA-48913 ORA-00060 ORA-609(,|$| ) ORA-65011 ORA-65020 ORA-31(,|$| ) ORA-7452 ORA-959(,|$| ) ORA-3136(,|)|$| ) ORA-07445.[kkqctdrvJPPD ORA-07445.[kxsPurgeCursor –
【问题讨论】:
【参考方案1】:您的blacklist
表看起来像like
模式,而不是正则表达式。
你可以这样写一个查询:
select dae.* -- or whatever columns you want
from V$DIAG_ALERT_EXT dae
where not exists (select 1
from ORA_BLACKLIST ob
where dae.message_text like ob.<column name>
);
如果表很大,这将不会有特别好的性能。
【讨论】:
@pritiprabhasahoo 请在帖子的“更新”部分添加有关您的问题的新信息。您的评论使读者更难以理解整体。考虑进行更新并删除评论。以上是关于Oracle 中 2 个 varchar 列(来自不同表)之间的正则表达式比较的主要内容,如果未能解决你的问题,请参考以下文章