对于以下示例 SQL:
CREATE TABLE "abc01"."SLI_EDF_INSTR"
( "EDF_INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE,
"EDF_KEY" NUMBER(10,0) NOT NULL ENABLE,
"INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE,
"LAST_REC_TXN_USER_ID" VARCHAR2(32 BYTE) NOT NULL ENABLE,
"LAST_REC_TXN_TYPE_CODE" VARCHAR2(1 BYTE) NOT NULL ENABLE,
"LAST_REC_TXN_DATE" TIMESTAMP (6) NOT NULL ENABLE,
"LAST_REC_TXN_USER_POST_NAME" VARCHAR2(60 BYTE) NOT NULL ENABLE);
CREATE OR REPLACE EDITIONABLE TRIGGER "abc01"."TRG_SLEI_BIU"
BEFORE INSERT OR UPDATE ON SLI_EDF_INSTR
FOR EACH ROW
DECLARE
post_name VARCHAR2(32);
BEGIN
IF :NEW.LAST_REC_TXN_USER_ID IS NULL THEN
:NEW.LAST_REC_TXN_USER_ID := 'SYSTEM';
END IF;
IF :NEW.LAST_REC_TXN_DATE IS NULL OR UPDATING THEN
:NEW.LAST_REC_TXN_DATE := SYSTIMESTAMP;
END IF;
IF :NEW.LAST_REC_TXN_USER_POST_NAME IS NULL THEN
SELECT NVL(MAX(USER_POST_NAME), 'SYSTEM') INTO post_name FROM UAC_USER WHERE UPPER(TRIM(USER_ID)) = UPPER(TRIM(:NEW.LAST_REC_TXN_USER_ID));
:NEW.LAST_REC_TXN_USER_POST_NAME := post_name;
END IF;
IF INSERTING THEN
:NEW.LAST_REC_TXN_TYPE_CODE := 'I';
ELSIF UPDATING THEN
IF :NEW.LAST_REC_TXN_TYPE_CODE <> 'D' OR :NEW.LAST_REC_TXN_TYPE_CODE IS NULL THEN
:NEW.LAST_REC_TXN_TYPE_CODE := 'U';
END IF;
END IF;
END;
我想编写一个正则表达式来匹配从 CREATE TABLE 开始直到但不包括“CREATE OR REPLACE...”,一旦我看到“CREATE OR REPLACE”,则停止匹配并在匹配中排除“CREATE OR REPLACE”。
期望的匹配是:
CREATE TABLE "abc01"."SLI_EDF_INSTR"
( "EDF_INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE,
"EDF_KEY" NUMBER(10,0) NOT NULL ENABLE,
"INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE,
"LAST_REC_TXN_USER_ID" VARCHAR2(32 BYTE) NOT NULL ENABLE,
"LAST_REC_TXN_TYPE_CODE" VARCHAR2(1 BYTE) NOT NULL ENABLE,
"LAST_REC_TXN_DATE" TIMESTAMP (6) NOT NULL ENABLE,
"LAST_REC_TXN_USER_POST_NAME" VARCHAR2(60 BYTE) NOT NULL ENABLE);
如何做到这一点?
在 notepad++ 中,我尝试勾选“匹配换行符”复选框,选择“正则表达式”,然后找到
CREATE TABLE.+(?![CREATE OR REPLACE])
但它匹配所有单词。
此正则表达式将匹配以 CREATE 开头的任何内容,使用负向前瞻不匹配 OR REPLACE,拾取任何内容直到下一个分号。
更新:一种替代的、更有效的方法是:
在 Notepad++ 中使用
search
和mark
正则表达式并亲自查看。结果: