*************************************************
** 转发请注明原文,尊重原创
** 原文来自: blog.csdn.net/clark_xu 徐长亮的专栏
*************************************************
场景:数据仓库中,数据加工的存储过程,要求使用公共的框架进行分区表的分区交换,统计日期转换;
但是总有一些开发者,总是不听话,不按照要求使用公共框架的过程进行分区表的分区交换、统计日期的转换;
针对这种情况,如何通过遍历各个package中所有的存储过程的代码,找到不规范的过程呢?
针对主要的表就是user_source
我的代码如下:
declare
cursor cur is
select upper(substr(unit_code, 1, instr(unit_code, '.') - 1)) as p_name,
upper(substr(unit_code, instr(unit_code, '.') + 1)) as proc_name
from meta_unit;
--在我的场景中,UNIT_CODE存放包的过程如:pkg_tools.p_test01这样的信息
max_line number;
mine_line number;
lvc_p_name varchar2(200 char);
lvc_proc_name varchar2(200 char);
lvc_sql varchar2(2000 char);
lvc_count number;
begin
for mycur in cur loop
begin
lvc_p_name := mycur.p_name;
lvc_proc_name := mycur.proc_name;
lvc_sql := 'select min(line)
from user_source
where name = ''' || mycur.p_name || '''
and type=''PACKAGE BODY''
and text like ''%' || mycur.proc_name || '%''';
execute immediate lvc_sql
into mine_line;
--希望通过procedure,end procedure来判断procedure在包中的代码的起始行号
max_line := mine_line + 90;
/* lvc_sql := 'select max(line)
from user_source
where name = ''' || mycur.p_name || '''
and type=''PACKAGE BODY''
and text like ''%' || mycur.proc_name || '%''';
execute immediate lvc_sql
into max_line;*/
lvc_sql := 'select count(*)
from user_source
where name = ''' || mycur.p_name || '''
and type = ''PACKAGE BODY''
and line >=' || mine_line || '
and line <=' || max_line || '
and (upper(text) like ''%PKG_0.P_0_GET%'' or upper(text) like ''%PKG_0.P_1_GET_TJRQ%'') ';
execute immediate lvc_sql
into lvc_count;
if lvc_count = '0' then
print_proc(lvc_p_name || '.' || lvc_proc_name ||
' count(P_0_GET): ' || lvc_count);
end if;
exception
when others then
print_proc(lvc_p_name || '.' || lvc_proc_name);
end;
end loop;
end;