如何在 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 中编写正则表达式匹配模式?的主要内容,如果未能解决你的问题,请参考以下文章