Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL-REGEXP_-LIKE_Regex_Plsql - Fatal编程技术网

PL/SQL-REGEXP_-LIKE

PL/SQL-REGEXP_-LIKE,regex,plsql,Regex,Plsql,我正在编写一个过程,从存储库中读取一些PL/SQL代码,然后验证每个过程/函数是否具有适当的文档头。给出变量my_code中包含的以下PL/SQL代码: my_code varchar2(1024) := ' script package test_lib is ------------------------------------------------------------------------------- -- <function name="my

我正在编写一个过程,从存储库中读取一些PL/SQL代码,然后验证每个过程/函数是否具有适当的文档头。给出变量my_code中包含的以下PL/SQL代码:

my_code varchar2(1024) := '
  script package test_lib
  is
     -------------------------------------------------------------------------------
     -- <function name="my_func" begin="9-Dec-2010">
     --   <summary>
     --     Test function.
     --   </summary>
     --   <authors>
     --     <author name="Giuseppe Greco" email="giuseppe.greco@b-source.ch"/>
     --   </authors>
     --   <params>
     --     <param name="num" mandatory="yes" type="input">
     --       Test param.
     --     </param>
     --   </params>
     --   <return>
     --     True if it is an alarm; otherwise, false.
     --   </return>
     -- </function>
     --------------------------------------------------------------------------------
     function my_func(par1 NUMBER)
     return boolean
     is
       l_num NUMBER := 0;
     begin
       if l_num < 1 then
         dbms_output.put_line(''my_func'');
       end if;
       return true;
     end my_func;
   end test_lib;
 ';
在上面的语句中,REGEXP_LIKE永远不会返回true,因此永远不会执行REGEXP_REPLACE。我要做的是确定代码是否至少包含一个过程,如果包含,我调用REGEXP_REPLACE来确定代码包含多少个过程(在上面的示例中,它应该返回1)。我首先调用REGEXP\u,因为如果代码不包含任何过程,REGEXP\u REPLACE就会崩溃

有什么想法或建议吗?任何帮助都将不胜感激

谢谢,
杰夫

我认为NVL不需要两张支票。尝试:

l_number_of_funcs := 
NVL(LENGTH(REGEXP_REPLACE(l_code,'(f)unction [^(]+\(|.','\1',1,0,'in')),0);
我无法测试这一点,但它应该朝着正确的方向发展

  • 尝试一个更简单的正则表达式

    '^.*function.*return.*(is|as).*begin.*end'
    
  • REGEXP_COUNT函数在这种情况下可能更合适

  • 多条线路的存在将严重破坏这一点。如果有多行,即使上面(1)中的简化正则表达式也不起作用。我建议您编写注释剥离器和换行符移除器,通过这些函数传递代码字符串,然后通过正则表达式运行它

  • 在任何情况下,使用正则表达式解析文本通常都不如人们所希望的那样有用。您确实需要一个PL/SQL解析器—请参阅


    分享和享受。

    你好,morja,非常感谢你的回答。。。但它并不像我预期的那样有效。语句执行后,函数的l_number_是20,而它应该是1(在示例中,代码只包含一个函数)。示例文本是什么样子的?当我在诸如“test procedure something end;test anywhere procedure something end”之类的东西上尝试正则表达式时,我将pp作为结果字符串,2作为长度……尝试以下操作:声明l_code varchar2(999):=“script package mb0_test_lib是函数my_func(par1 NUMBER)返回布尔值是l_num NUMBER:=0;如果l_num<1,则开始dbms_输出。放置_行(“我的函数”);如果结束;返回true;结束我的工作;过程my_proc()是begin dbms_output.put_line(“my_proc”);结束我的程序;结束mb0_测试_lib;';l_函数数:=0;begin l_funcs:=NVL(长度(REGEXP_替换(l_代码),(f)函数(?:(!end;)))*end;|.,'\1')),0);如果l_funcs>0,则dbms_output.put_line('Nr of functions:'| | l_funcs);如果结束;终止好的,我明白了。“过程”是否可能出现在过程声明之外的其他地方?如果不是的话,你可以像我在编辑的文章中所做的那样。正如鲍勃·贾维斯所说,也许问题在于新词。我更新了REGEXP_REPLACE并添加了I=ignore大小写和n=dot匹配所有参数。不幸的是,我们使用的是Oracle 9.2,它不支持REGEXP_计数-这是我第一次尝试:-)
    '^.*function.*return.*(is|as).*begin.*end'