正则表达式为oracle"创建程序"定义

时间:2016-02-26 11:06:38

标签: sql regex oracle regex-lookarounds

我需要正则表达式来捕捉完整的"创建程序"言。

以下是我用于测试我的正则表达式的示例之一:

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;
/

当前正则表达式:

/CREATE\s+(OR\s+REPLACE\s+)?PROCEDURE\s+(\w+)\s*\(((?!.*\bEND\b\s*(\w+\s*)?\;\s*\/).*\s*)+.+/

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

经过对regexr.com等在线调试器的大量测试后,我在正则表达式中找不到问题。

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

1 个答案:

答案 0 :(得分:0)

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

CREATE(\s+OR\s+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+OR\s+REPLACE)\s+PROCEDURE.*?END;\s*/$', 'n' );

<强>输出

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