大型企业中复杂数据库存储过程的修改方法:7步法教你高效完成任务
在企业的数据库中,根据不同的业务场景、统计需求、生产管理需要等,往往会有众多的存储过程。特别是在大型企业中,业务变化快,人员复杂,使得存储过程数量很多,不同代码编写风格有所差异等。最终导致存储过程修改困难。
一、示例
下面示例存储过程,每天对所有的宽带行进分类,生成日报供后续经营情况分析使用。
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步法教你高效完成任务相关推荐
- mysql数据库存储过程及调用方法
mysql数据库存储过程及调用方法 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出.6.0不仅支持大型数据库如oracle等的绝大部分功 能,如存储过程.视图.触发 ...
- mysql idataparameter_asp.net中IDataParameter调用存储过程的实现方法
本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧.分享给大家供大家参考. 具体实现方法如下: public string ...
- oracle失效对象是什么意思,Oracle中无效数据库对象的处理方法
Oracle中无效数据库对象的处理方法 Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功.虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作.通常无效对 ...
- 传奇服务器是测试模式怎么修改,www.23bb.net告诉你传奇服务端中默认系统提示文字修改方法...
在玩传奇中中,常见一些系统提示,如人物在安全区中扔东西时,会弹出对话框提示禁止扔,或者在游戏登陆时提示攻击模式,及人物行会显示与夫妻称号显示格式等所有的系统默认格式.其实这些格式都是可以进行修改的,今 ...
- 关于OleDbCommand中操作数据库的几种方法的区别
在vb.net中利用OleDb的OleDbCommand类操作数据库,有以下这些方法: ExecuteNoQuery() 返回值类型integer,常用来执行增删改操作,返回操作影响的行数 Execu ...
- python中操作数据库中游标的使用方法
cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象,这个时候cursor中还没有数据,只有等到fetcho ...
- 使用Java Spring消费MySQL中的数据库存储过程
进行这个练习的一些先决条件. 创建一张student数据库表: CREATE TABLE Student(ID INT NOT NULL AUTO_INCREMENT,NAME VARCHAR(20) ...
- HKC G801手机中相机及视频问题修改方法
首先下载一个注册表编辑软件,网上很多绿色的软件,随便一个都可以的.找到HKEY_LOCAL- MACHINE/SYSTEM/PICTURES/CAMERA/ ...
- Mysql中复制数据库的两种方法
方法一:使用mysqldump 创建新的数据库 create database new_db 同一个mysql服务器复制数据库方法 mysqldump old_db -u 账户 -p密码 | mysq ...
最新文章
- import android.support.v7.widget.RecyclerView失败
- 用WORD2010写博客,并发送至博客园
- 【操作系统】I/O子系统的层次结构和核心I/O子系统
- video downloadhelper 无时间限制_如何避免背景音乐侵权?自媒体和vlog必备的七大无版权背景音乐网...
- HDU 3394 Railway(点双连通分量)
- 软件工程理论、方法与实践(第三章)
- WPS(Word)中图注、域的使用基础
- 从细节入手为您的客户创造价值
- Mybatis-Plus批量新增
- java excel 打不开_Java使用POI生成Excel文件后打不开的问题
- 遥感影像人口数据、气象数据、社会统计数据、GDP空间分布数据
- 原生js实现对未来dom的事件绑定
- [Android]APP中保持屏幕不自动灭屏的一种方法
- 新版本微信分享sdk(1.8.3)踩坑实录
- libxml2主要函数说明
- 动态磁盘和基本磁盘转换
- Ubuntu 18.04 下载安装NVIDIA显卡驱动和CUDA
- 2021年高考湖南成绩查询,2021年湖南高考查分网站查分网址:https://www.hneeb.cn/
- C语言 关于for循环里定义的变量
- 急性心机梗护理查房PPT模板