在企业的数据库中,根据不同的业务场景、统计需求、生产管理需要等,往往会有众多的存储过程。特别是在大型企业中,业务变化快,人员复杂,使得存储过程数量很多,不同代码编写风格有所差异等。最终导致存储过程修改困难。

一、示例

下面示例存储过程,每天对所有的宽带行进分类,生成日报供后续经营情况分析使用。

create or replace procedure prc_cm_kd_type  (  p_begin_step number   default 0  )  isv_author    varchar2(50)   := 'lyf';
v_proc_name varchar2(100)  := comm.fn_get_my_name;
v_proc_desc varchar2(100)  := '宽带分类日清单';
v_run_cycle varchar2(10)   := '日报';
v_step      number         := 0 ;
v_out_table varchar2(200)  :='tbl_cm_kd_type' ;
v_sql varchar2(4000);
v_kd_prod_ids varchar2(500);
v_table_name varchar2(100); begin
log_autorun_insert( v_author ,v_proc_name ,v_proc_desc, v_run_cycle,v_out_table  ) ;--第一部分
v_step:= 0  ;
SELECT to_char(wm_concat(prod_id))
INTO v_kd_prod_ids
FROM vew_cfg_prod_type
WHERE prod_type = '宽带'AND prod_cat NOT IN ('ITV');
prc_wait_simple(
p_check_sql =>'
select  case when  result_flag like ''%0%'' then 0 else 1 end
from (selectfn_check_pre_obj(''prod_inst '',''table'',3 )  ||''1'' as result_flagfrom  dual
)  ' );--第二部分
v_step:=1;
log_autorun_step(v_author ,v_proc_name,v_step);
if v_step>=p_begin_step thenpub.prc_drop_table('tbl_cm_kd_type_tmp_1'); execute immediate 'create table tbl_cm_kd_type_tmp_1  compress   as select  prod_inst_id , acc_num ,prod_id ,owner_cust_id as cust_id,status_cd  from  prod_inst  where status_cd in ( 100000      , 110009    , 120000    )   -- 在用 预拆机  停机 and prod_id in ( ' || v_kd_prod_ids||' ) ';
end if; --第三部分
v_step:= 3  ;
log_autorun_step(v_author ,v_proc_name,v_step);
if v_step>=p_begin_step thenpub.prc_drop_table('tbl_cm_kd_type_tmp_3'); beginprc_get_kd_type(p_in_table =>  'tbl_cm_kd_type_tmp_1' ,p_in_column => 'prod_inst_id',p_out_table => 'tbl_cm_kd_type_tmp_3' );end;
end if; --第四部分
v_step:= 4  ;
log_autorun_step(v_author ,v_proc_name,v_step);
if v_step>=p_begin_step then pub.prc_drop_table('tbl_cm_kd_type');   execute immediate 'create table  tbl_cm_kd_type compress as select a.prod_inst_id , a.acc_num ,a.prod_id ,a.cust_id,a.status_cd ,  b.type1 ,b.type2 ,b.is_school,  --校园宽带b.is_wifi,   --wifi宽带b.is_family,  -b.is_awifi,   b.is_apartment ,   b.is_mix ,b.kd_value , b.kd_value_match_method ,  sysdate load_date from tbl_cm_kd_type_tmp_1 a , tbl_cm_kd_type_tmp_3 bwhere a.prod_inst_id=b.prod_inst_id (+) ';   execute immediate 'create index  tbl_cm_kd_type  on  tbl_cm_kd_type (prod_inst_id) compress  ';  execute immediate 'grant select on tbl_cm_kd_type to fsjifen';
end if;--第五部分
v_step:= 100  ;
log_autorun_step(v_author ,v_proc_name,v_step);
if v_step>=p_begin_step thenexecute immediate 'grant select on  '|| v_out_table||'   to fsmk, sdtj, nhtj, cctj, sstj, gmtj ';
end if ; --第六部分
pub.prc_drop_table('tbl_cm_kd_type_tmp_1');
pub.prc_drop_table('tbl_cm_kd_type_tmp_2');
pub.prc_drop_table('tbl_cm_kd_type_tmp_3');--第七部分
v_step:= 101  ;
log_autorun_step(v_author ,v_proc_name,v_step);
if v_step>=p_begin_step thenif   to_number(to_char(sysdate,'dd'))=1 then   v_table_name := 'tbl_cm_kd_type_'|| to_char( add_months(sysdate,-1),'yyyymm')  ;pub.prc_drop_table(v_table_name,'fsit');v_table_name :=''||v_table_name ;    execute immediate 'create table   '|| v_table_name ||'  compress  nologging as   select * from tbl_cm_kd_type  ';      execute immediate 'create index '|| v_table_name ||' on '|| v_table_name ||' ( prod_inst_id) compress nologging'; end if;
end if; --第八部分
log_autorun_sucess (  v_author, v_proc_name ) ;
exception when others thenrollback;dbms_output.put_line(  v_sql);log_autorun_error (  v_author, v_proc_name , v_step  , substr( sqlerrm ,1, 400 )  ) ;
end;

二、存储过程分析修改7步法

1.理解存储过程的作用

每个存储过程都有其目标和作用,所以在做深入理解之前,首先必须了解存储过程的作用,及对应的业务意义。从宏观的角度,明确目的,以免走偏。

示例分析:通过业务了解,示例的存储过程,是对所有客户的宽带进行每天拍照,通过特定的业务口径,对宽带进行分类,比如分为单宽带、融合宽带(有对应手机号码)、校园宽带、公寓宽带等。

2.理解存储过程的输入输出

明确存储过程的输入输出,理解存储过程的边界,知道存储过程的运行依赖于什么条件(输入),知道存储过程的修改会影响到什么(输出)。

这里指的输入输出,不单只是代码中定义的输入值、输出值。输入也泛指存储过程中使用到的其他数据表、函数、过程等。输出也泛指存储过程执行中会修改到的中间表、结果表、日志表等。

示例分析:

输入值:p_begin_step通过开始步骤序号,可以使存储过程从中间某部分开始重新执行

前置的数据表:prod_inst产品实例表,记录了原始的客户宽带号码信息

生成的结果表:tbl_cm_kd_type每天拍照生成的宽带分类表、tbl_cm_kd_type_yyyymm每月1日生成的月表

3.分析存储过程的总体结构

分析存储过程的结构,理解每部分的涵义,以便能准确定位存储过程需要修改的部分。

示例分析:

示例的代码结构是十分清晰的,该代码共分成了8部分,通过注释已分隔好了各部分。但每部分的含义,并没有通过注释标明,需要进一步理解。通过进一步分析得出了各部分含义。

第一部分:验证存储过程执行的前置条件是否满足。

第二部分:生成基础数据表

第三部分:在基础数据表汇总补充宽带类型信息

第四部分:生成结果表

第五部分:授权结果表到其他数据库用户

第六部分:清理临时表

第七部分:每月1日生成月表

第八部分:异常处理

4.分析存储过程中的调用关系(关系结构图)

大型企业中,存储过程之前的调用关系往往错综复杂。不理解存储过程之间的调用关系,首先可能连存储过程都读不懂,其次存储过程修改后如果出错,可能难以分析原因。因此分析存储过程之间的调用关系显得尤为重要。

示例分析:

该存储过程调用了6个关联的函数/过程,分别为log_autorun_insert、fn_check_pre_obj、pub.prc_drop_table、prc_get_kd_type、log_autorun_success、log_autorun_error。

如果要继续深入理解某部分的内容,比如要知道宽带类型(kd_type1)是由怎样的逻辑生成的,就要再去分析prc_get_kd_type的结构和调用关系了。

最后可使用code_map整理代码之间的调用关系图如下。

5.定位需要修改的部分,分析修改后的影响,预期修改后的结果

对应业务需求,在上述结构分析、调用关系分析的基础上,定位需要修改的部分。以及代码修改后的影响,初步预期修改后的效果,比如数据表会发生怎么样的数量级变化等。

示例分析:

本例需要修改宽带类型中,校园宽带类型的生成逻辑,因此定位需到prc_get_kd_type进一步分析修改。

6.对代码进行修改,调试

对代码进行修改,并调试保证代码能够正常运行。同时保证没有影响存储过程的其他输出。

7. 验证修改的结果,完成修改

最后对存储过程全程运行,验证修改后的结果,观察是否与预期结果相近。

示例分析:示例主要生成的是tbl_cm_kd_type的结果表,前期业务分析,预期修改了校园类型宽带的生成逻辑后,校园宽带数量会降低30%左右。在存储过程修改后,通过group by统计,确认与预期结果基本一致,修改完成。

大型企业中复杂数据库存储过程的修改方法:7步法教你高效完成任务相关推荐

  1. mysql数据库存储过程及调用方法

    mysql数据库存储过程及调用方法 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出.6.0不仅支持大型数据库如oracle等的绝大部分功 能,如存储过程.视图.触发 ...

  2. mysql idataparameter_asp.net中IDataParameter调用存储过程的实现方法

    本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧.分享给大家供大家参考. 具体实现方法如下: public string ...

  3. oracle失效对象是什么意思,Oracle中无效数据库对象的处理方法

    Oracle中无效数据库对象的处理方法 Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功.虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作.通常无效对 ...

  4. 传奇服务器是测试模式怎么修改,www.23bb.net告诉你传奇服务端中默认系统提示文字修改方法...

    在玩传奇中中,常见一些系统提示,如人物在安全区中扔东西时,会弹出对话框提示禁止扔,或者在游戏登陆时提示攻击模式,及人物行会显示与夫妻称号显示格式等所有的系统默认格式.其实这些格式都是可以进行修改的,今 ...

  5. 关于OleDbCommand中操作数据库的几种方法的区别

    在vb.net中利用OleDb的OleDbCommand类操作数据库,有以下这些方法: ExecuteNoQuery() 返回值类型integer,常用来执行增删改操作,返回操作影响的行数 Execu ...

  6. python中操作数据库中游标的使用方法

    cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetcho ...

  7. 使用Java Spring消费MySQL中的数据库存储过程

    进行这个练习的一些先决条件. 创建一张student数据库表: CREATE TABLE Student(ID INT NOT NULL AUTO_INCREMENT,NAME VARCHAR(20) ...

  8. HKC G801手机中相机及视频问题修改方法

    首先下载一个注册表编辑软件,网上很多绿色的软件,随便一个都可以的.找到HKEY_LOCAL-                      MACHINE/SYSTEM/PICTURES/CAMERA/  ...

  9. Mysql中复制数据库的两种方法

    方法一:使用mysqldump 创建新的数据库 create database new_db 同一个mysql服务器复制数据库方法 mysqldump old_db -u 账户 -p密码 | mysq ...

最新文章

  1. import android.support.v7.widget.RecyclerView失败
  2. 用WORD2010写博客,并发送至博客园
  3. 【操作系统】I/O子系统的层次结构和核心I/O子系统
  4. video downloadhelper 无时间限制_如何避免背景音乐侵权?自媒体和vlog必备的七大无版权背景音乐网...
  5. HDU 3394 Railway(点双连通分量)
  6. 软件工程理论、方法与实践(第三章)
  7. WPS(Word)中图注、域的使用基础
  8. 从细节入手为您的客户创造价值
  9. Mybatis-Plus批量新增
  10. java excel 打不开_Java使用POI生成Excel文件后打不开的问题
  11. 遥感影像人口数据、气象数据、社会统计数据、GDP空间分布数据
  12. 原生js实现对未来dom的事件绑定
  13. [Android]APP中保持屏幕不自动灭屏的一种方法
  14. 新版本微信分享sdk(1.8.3)踩坑实录
  15. libxml2主要函数说明
  16. 动态磁盘和基本磁盘转换
  17. Ubuntu 18.04 下载安装NVIDIA显卡驱动和CUDA
  18. 2021年高考湖南成绩查询,2021年湖南高考查分网站查分网址:https://www.hneeb.cn/
  19. C语言 关于for循环里定义的变量
  20. 急性心机梗护理查房PPT模板

热门文章

  1. 简述igp和egp_igp egp
  2. python两张图片无缝合成一张,Python实现拼接多张图片的方法
  3. 【微前端开发环境下,加载远程子应用的实战。】
  4. Linux之网络管理
  5. idea修改中文字体
  6. ~ 运算符和 ~~ 运算符(JS)
  7. Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架
  8. html中div的定位,html中div定位练习
  9. 滴滴开源Android插件框架
  10. HDU 5755 Gambler Bo(数论)