ETL系列:一种遍历各个package包中过程的代码的方法

来源:互联网 发布:淘宝支付密码怎么修改 编辑:程序博客网 时间:2024/05/22 05:24
*************************************************** 转发请注明原文,尊重原创** 原文来自: 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;


 

1 0
原创粉丝点击