首页 > 解决方案 > Oracle 中 2 个 varchar 列(来自不同表)之间的正则表达式比较

问题描述

我正在尝试找到一种从 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]

我想写一个类似下面的查询来忽略黑名单错误,只捕获下面的相关信息。

select dae.instance_id, dae.container_name, err_count, dae.message_level from ORA_BLACKLIST ob, V$DIAG_ALERT_EXT dae where group by .....;

有人可以建议一种方法或示例代码来实现它吗?

我应该提供黑名单表的确切内容。它目前包含一些正则表达式(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 –</p>

标签: sqloracle

解决方案


您的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>
                 );

如果表很大,这将不会有特别好的性能。


推荐阅读