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 列(来自不同表)之间的正则表达式比较的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 列操作(增加列,修改列,删除列)

在SQL语句中怎样对varchar型别的列进行数值大小的比较

从 Oracle 迁移 VARCHAR2 数据时的列长度

oraclede中数据定义语言

Oracle中表列由VARCHAR2类型改成CLOB

将时间戳插入 Oracle 数据库中的 Varchar2 列