PL/SQL-REGEXP_-LIKE
我正在编写一个过程,从存储库中读取一些PL/SQL代码,然后验证每个过程/函数是否具有适当的文档头。给出变量my_code中包含的以下PL/SQL代码: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
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'
分享和享受。你好,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'