如何在 Pl/SQL 中编写正则表达式匹配模式?

Posted

技术标签:

【中文标题】如何在 Pl/SQL 中编写正则表达式匹配模式?【英文标题】:How to write the pattern in regular expression matching in Pl/SQL? 【发布时间】:2015-12-07 12:11:49 【问题描述】:

我在 Oracle 中编写了一个子字符串正则表达式。我遇到了正确的模式匹配问题。子字符串查询首先将触发器的 ddl 提取到一个字符串中,然后尝试将表的列从中分离出来。

触发 DDL

CREATE OR REPLACE TRIGGER "SHIVAMG"."DVJ_CI_CURRENCY_CD_L_IU"
  BEFORE INSERT OR UPDATE ON CI_CURRENCY_CD_L
  FOR EACH ROW
BEGIN
  IF INSERTING THEN
    IF (UPPER(:NEW.CURRENCY_CD) NOT LIKE 'ZZ%') THEN
      INSERT INTO JUNITUSR.CI_CURRENCY_CD_L
        (CURRENCY_CD,
         LANGUAGE_CD,
         DESCR,
         VERSION)
      SELECT :NEW.CURRENCY_CD,
             :NEW.LANGUAGE_CD,
             :NEW.DESCR,
             :NEW.VERSION
       FROM DUAL
       WHERE NOT EXISTS
         (SELECT 1
            FROM JUNITUSR.CI_CURRENCY_CD_L B
            WHERE B.CURRENCY_CD =:NEW.CURRENCY_CD AND
                  B.LANGUAGE_CD = :NEW.LANGUAGE_CD);
    END IF;
  END IF;

  IF UPDATING THEN
    IF (UPPER(:NEW.CURRENCY_CD) NOT LIKE 'ZZ%') THEN
      UPDATE JUNITUSR.CI_CURRENCY_CD_L A
        SET CURRENCY_CD     =:NEW.CURRENCY_CD,
            LANGUAGE_CD       =:NEW.LANGUAGE_CD,
            DESCR             =:NEW.DESCR ,
            VERSION           =:NEW.VERSION
        WHERE A.CURRENCY_CD = :OLD.CURRENCY_CD AND
              A.LANGUAGE_CD =:OLD.LANGUAGE_CD;
    END IF;
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001,'ERROR: <DVJ_CI_CURRENCY_CD_L_IU> ' || SQLERRM);
END;

ALTER TRIGGER "SHIVAMG"."DVJ_CI_CURRENCY_CD_L_IU" ENABLE"   

子串查询

SELECT REGEXP_SUBSTR((SELECT REGEXP_SUBSTR 
    (( select dbms_metadata.get_ddl('TRIGGER', 'DVJ_CI_CURRENCY_CD_L_IU' ) from dual), 'INSERT INTO(.*)+\)')FROM dual),'\((.*)\)') FROM DUAL;

【问题讨论】:

请编辑您的问题并包括:1) 您期望的结果,以及 2) 您得到的结果。谢谢。 问题不清楚。请详细说明 【参考方案1】:

我找到了正确的子字符串查询以从触发器代码中收集各个列名。如下:

SELECT REGEXP_SUBSTR((SELECT REGEXP_SUBSTR((SELECT REGEXP_SUBSTR (( SELECT dbms_metadata.get_ddl( 'TRIGGER',trig_name,'CISADM') FROM dual),
'INSERT(\s|\n)+INTO[^\)]+\)',1,1,'n') FROM dual),'[\(](\s|\n|.)+[\)]')
 FROM DUAL),'(\w)+',1,counter)INTO temp_col_name FROM dual;

【讨论】:

以上是关于如何在 Pl/SQL 中编写正则表达式匹配模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在字符串中返回第 n 个正则表达式匹配?

正则表达式:如何在 PL/SQL 中实现负向后查找

如何编写正则表达式模式来获取匹配的字符串?

PL/SQL 正则表达式检查

如何编写正则表达式模式以匹配字符串结尾或字符串开头的货币符号

PL/SQL Oracle 正则表达式对于零的出现不起作用