用于 Oracle 的正则表达式"创建过程"定义



我需要正则表达式来捕获完整的"创建过程"语句。

这是我用来测试正则表达式的示例之一:

CREATE OR REPLACE PROCEDURE sp_for_comp (P_VARNAME IN VARCHAR2, P_VALUE IN OUT NUMBER)
   as
   v_if_exists NUMBER(10,0);
BEGIN
   SELECT   COUNT(*) INTO v_if_exists FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;
   IF v_if_exists > 0
   THEN
      begin
         SELECT VALUE INTO P_VALUE FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;
         EXCEPTION
         WHEN OTHERS THEN
            NULL;
      end;
ELSE
      begin
         INSERT INTO PKG_VAR  VALUES(P_VARNAME, P_VALUE);
         EXCEPTION
         WHEN OTHERS THEN
            NULL;
      end;
   END IF;
END;
/

当前正则表达式:

/CREATEs+(ORs+REPLACEs+)?PROCEDUREs+(w+)s*(((?!.*bENDbs*(w+s*)?;s*/).*s*)+.+/

至于我的问题:我使用 QRegularExpression 类,当我在大文件上运行它时程序失败。另外,当我在小文件上运行它时 - 一切正常。

在对在线调试器(如 regexr.com)进行了大量测试后,我找不到正则表达式中的问题。

我应该如何改变它,哪里可能有问题?

尝试一些非常简单的事情,例如:

CREATE(s+ORs+REPLACE)s+PROCEDURE.*?END;s*/

它只是在开头查找CREATE OR REPLACE PROCEDURE,然后结束将END;后跟下一行的/(指示 SQL 作用域中 PL/SQL 块的结束),两者之间的量最小。

(注意:您可能希望使用 ni 正则表达式匹配参数,以允许.匹配换行符并执行不区分大小写的匹配。

示例

CREATE TABLE script (value ) AS
SELECT  'CREATE OR REPLACE PROCEDURE sp_for_comp (P_VARNAME IN VARCHAR2, P_VALUE IN OUT NUMBER)' || CHR(10)
        || '   as' || CHR(10)
        || '   v_if_exists NUMBER(10,0);' || CHR(10)
        || 'BEGIN' || CHR(10)
        || '   SELECT   COUNT(*) INTO v_if_exists FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;' || CHR(10)
        || '   IF v_if_exists > 0' || CHR(10)
        || '   THEN' || CHR(10)
        || '      begin' || CHR(10)
        || '         SELECT VALUE INTO P_VALUE FROM PKG_VAR WHERE VARIABLENAME = P_VARNAME;' || CHR(10)
        || '         EXCEPTION' || CHR(10)
        || '         WHEN OTHERS THEN' || CHR(10)
        || '            NULL;' || CHR(10)
        || '      end;' || CHR(10)
        || 'ELSE' || CHR(10)
        || '      begin' || CHR(10)
        || '         INSERT INTO PKG_VAR  VALUES(P_VARNAME, P_VALUE);' || CHR(10)
        || '         EXCEPTION' || CHR(10)
        || '         WHEN OTHERS THEN' || CHR(10)
        || '            NULL;' || CHR(10)
        || '      end;' || CHR(10)
        || '   END IF;' || CHR(10)
        || 'END;' || CHR(10)
        || '/'
FROM DUAL;
SELECT COUNT(*)
FROM   script
WHERE  REGEXP_LIKE( value, '^CREATE(s+ORs+REPLACE)s+PROCEDURE.*?END;s*/$', 'n' );

输出

COUNT(*)
--------
       1

最新更新