我有一个sql脚本来创建或替换oracle上的包,我需要检查查询是否使用"user"."object“之类的Schema语法,以获得类似create或alter的指令。regex很简单,但在创建包的情况下,对我来说并不容易,因为在某些情况下,它可以包含"BODY“一词。
假设我的文件包含以下行(除其他外):
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE AUTOMIC.PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY AUTOMIC.PKG_MASSIVE_SERVICE_AUTOMIC 第二行和四行是唯一有效的,如何才能只匹配无效的查询,即第1和第3行?
我试着用:
^CREATE\sOR\sREPLACE\sPACKAGE\s[a-zA-Z_0-9]+\s但它会返回:
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY AUTOMIC.PKG_CLAUSE_TIME_V1_241_AUTOMIC然后我试着用一个查找器“
CREATE\sOR\sREPLACE\sPACKAGE\s(?=BODY\s)[a-zA-Z_0-9]+\s但也不起作用。
下面是一个脚本文件示例:
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
IS
Type REF_CUR Is Ref Cursor;
PROCEDURE PRC_GETACTIVATIONINFO_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
PROCEDURE PRC_GETPAYMENTINFO_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
PROCEDURE PRC_GETACTIVAPROCESSINFO_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
PROCEDURE PRC_UPDATEPAGOS_ARUS
(
VIDACTIVACION IN NUMBER,
VIDPAGOSACTIVACION IN NUMBER
);
PROCEDURE PRC_GETACTPROCSBILLINGINF_ARUS
(
VIDACTIVACION IN NUMBER,
RES_CURSOR OUT REF_CUR
);
END;
/
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC
IS
PROCEDURE PRC_GETACTIVATIONINFO_ARUS发布于 2019-04-05 21:20:37
假设在通缉线中只有一个点,这似乎是可行的。如果变量$InStuff中有示例行,则会返回没有“Sometext”的两行。在他们身上..。
$InStuff -notmatch ' [a-z]+\.'输出..。
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIC发布于 2019-04-05 22:12:20
要只匹配CREATE OR REPLACE PACKAGE ...行,其中...不包含(文字) . (仅由字母、数字、下划线和空格组成),只需确保regex与整行匹配即可。
(Get-Content some.sql) -match '^CREATE\sOR\sREPLACE\sPACKAGE\s[\sa-z_0-9]+$'注意,我已经删除了不需要的A-Z,因为PowerShell的-match运算符不区分大小写(-cmatch可以用于区分大小写的匹配)。
发布于 2019-04-05 22:33:19
从字面上看问题标题,这是一个带有负前瞻 (?!.*\..*)的解决方案。
如果将较长的示例存储在文件.\some.sql中,则考虑到一行--CREATE...--在没有锚点^的情况下不会从第1行开始
(Get-Content .\some.sql) -match "CREATE\sOR\sREPLACE\sPACKAGE\s(BODY )?(?!.*\..*)"产生这个输出。
CREATE OR REPLACE PACKAGE PKG_MASSIVE_SERVICE_AUTOMIC
CREATE OR REPLACE PACKAGE BODY PKG_MASSIVE_SERVICE_AUTOMIChttps://stackoverflow.com/questions/55543371
复制相似问题