oracle中的存储过程(实例一)
引子
这是公司测试环境的老问题了。
业务系统的生产环境,有专人配置基础数据,有运维人员管理。而测试环境没有人员维护,基础配置信息数据过期后,导致系统无法正常使用。
以往的解决办法:
1. 联系外围管理系统(销售管理系统)负责人协助配置。
2. 配置信息,审核通过后同步到核心,确认后可以使用。
下面进入正题,存过实现迁移生产环境数据到测试环境
1. 解决方案(版本1.1)
工具:数据库存过
思路:需要导入数据的表放在数据库中。遍历这些表,在遍历过程中先删除表中符合条件的数据,然后将生产环境符合条件的数据迁入到当前环境中
/*****************************************************************************\
* Name: P_IMPORT_CHA_DATA
* PROCEDURE: 导生产环境基础数据(代理人信息)
* Paramater: IC_C_CHA_CDE 代理人代码
* Programmer: lyt
* Date: 2019/10/12
* Update:
* 需导入表配置:T_IMPORT_TABLE WHERE C_MARK = '2';
* 维护dbquery中间库表结构:SELECT 'CREATE TABLE T_' || C_TABLE || ' AS SELECT * FROM ZSSYS.' || C_TABLE || ' WHERE ROWNUM = 0;',A.* FROM T_IMPORT_TABLE A;
* 如果手续费打包时提示:算税平台找不到该代理人,需联系算税平台(沈一栋)邵先路,将算税生产环境信息同步到对应环境
\*****************************************************************************/ PROCEDURE P_IMPORT_CHA_DATA(IC_C_CHA_CDE VARCHAR2) AS
LB_SQL CLOB;
LB_COLS CLOB;
LB_COND CLOB;
LN_ROWS NUMBER;
CURSOR CUR_TABLE IS
SELECT * FROM T_IMPORT_TABLE WHERE C_MARK = '';
BEGIN
FOR LR_TABLE IN CUR_TABLE LOOP SELECT WM_CONCAT(COLUMN_NAME)
INTO LB_COLS
FROM USER_TAB_COLS@LINK_CORE
WHERE TABLE_NAME = 'T_' || UPPER(LR_TABLE.C_TABLE)
ORDER BY COLUMN_ID; LB_COND := ' WHERE '; IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_COM_ACCT') THEN
LB_COND := LB_COND || 'C_REL_CDE ';
ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER') THEN
LB_COND := LB_COND || 'C_CLNT_CDE ';
ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER') THEN
LB_COND := LB_COND || 'C_AGT_AGR_NO IN (SELECT C_AGT_AGR_NO FROM ZSSYS.WEB_CUS_CONFER WHERE C_CLNT_CDE';
ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
LB_COND := LB_COND || 'C_SLS_CDE IN(SELECT C_SLS_CDE FROM ZSSYS.WEB_CUS_CHA WHERE C_CHA_CDE';
ELSE
LB_COND := LB_COND || 'C_CHA_CDE ';
END IF; IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER' OR UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || ''')';
ELSE
LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || '''';
END IF; LB_SQL := 'DELETE FROM ZSSYS.' || LR_TABLE.C_TABLE || LB_COND; EXECUTE IMMEDIATE LB_SQL; LB_SQL := 'INSERT INTO ZSSYS.' || LR_TABLE.C_TABLE || '(' || LB_COLS ||
') SELECT ' || LB_COLS || ' FROM ' || 'ZSSYS.' ||
LR_TABLE.C_TABLE || '@LINK_CORE '|| LB_COND; EXECUTE IMMEDIATE LB_SQL;
END IF;
END LOOP;
--COMMIT;
END P_IMPORT_CHA_DATA;
涉及知识点
1.1 oracle 中的for循环
FOR LR_TABLE IN CUR_TABLE LOOP
END LOOP;
1.2 oracle 中的条件分支语句
IF () THEN
...;
ELSIF () THEN
...;
ELSE
...;
END IF;
1.3 存过中入参
1.4 游标 cursor
Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。
1). 隐式游标:无需定义,Select /Update / Insert/Delete操作,就是隐式Cursor
2). 显式游标:
cursor <cursor>[(<param_list>)]is <select_statement>;
3). 动态游标:
Type [Cursor type name] is ref cursor
游标的属性(4个)1.found 2.notfound 3.rowcount 4.isopen
2. 存过怎么调试?
2.1 如何打断点

2.2 如何调试
首先在左侧列表中,选中对应存过,右键后点击add debug informaintion(添加调试信息),然后在点Test,显示如下页面:

最上面一排是debug相关按键区域,中间为代码显示部分,左下为变量值显示区域(填写变量名称,执行过程中查看变量值)
2. 解决方案(版本1.2)
版本1.1存在的问题:由于部分表之间存在外键约束,导致删除操作失败。
解决思路:先反向遍历表完成全部删除操作(删除符合条件的数据),在遍历表完成插入操作,这里用到动态索引
/*****************************************************************************\
* Name: P_IMPORT_CHA_DATA
* PROCEDURE: 导生产环境基础数据(代理人信息)
* Paramater: IC_C_CHA_CDE 代理人代码
* Programmer: lyt
* Date: 2019/10/12
* Update:
* 需导入表配置:T_IMPORT_TABLE WHERE C_MARK = '2';
* 如果手续费打包时提示:算税平台找不到该代理人,需联系算税平台(沈一栋)邵先路,将算税生产环境信息同步到对应环境
\*****************************************************************************/ PROCEDURE P_IMPORT_CHA_DATA(IC_C_CHA_CDE VARCHAR2) AS
TYPE ref_cursor_type IS REF CURSOR;
CUR_TABLE ref_cursor_type;
LR_TABLE ZSSYS.T_IMPORT_TABLE%ROWTYPE;
LB_SQL CLOB;
LB_COLS CLOB;
LB_COND CLOB;
BEGIN
FOR i IN 1 .. 2 LOOP IF (i = 1) THEN
OPEN CUR_TABLE FOR
SELECT *
FROM ZSSYS.T_IMPORT_TABLE
WHERE C_MARK = ''
ORDER BY C_TABLE_NO DESC;
ELSE
OPEN CUR_TABLE FOR
SELECT *
FROM ZSSYS.T_IMPORT_TABLE
WHERE C_MARK = ''
ORDER BY C_TABLE_NO;
END IF; LOOP
FETCH CUR_TABLE
INTO LR_TABLE;
EXIT WHEN CUR_TABLE%NOTFOUND; SELECT WM_CONCAT(COLUMN_NAME)
INTO LB_COLS
FROM DBA_TAB_COLS@LINK_CORE
WHERE TABLE_NAME = 'T_' || UPPER(LR_TABLE.C_TABLE)
AND OWNER = 'ZSSYS'
ORDER BY COLUMN_ID; LB_COND := ' WHERE '; IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_COM_ACCT') THEN
LB_COND := LB_COND || 'C_REL_CDE ';
ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER') THEN
LB_COND := LB_COND || 'C_CLNT_CDE ';
ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER') THEN
LB_COND := LB_COND ||
'C_AGT_AGR_NO IN (SELECT C_AGT_AGR_NO FROM ZSSYS.WEB_CUS_CONFER@LINK_CORE WHERE C_CLNT_CDE';
ELSIF (UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
LB_COND := LB_COND ||
'C_SLS_CDE IN(SELECT C_SLS_CDE FROM ZSSYS.WEB_CUS_CHA@LINK_CORE WHERE C_CHA_CDE';
ELSE
LB_COND := LB_COND || 'C_CHA_CDE ';
END IF; IF (UPPER(LR_TABLE.C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
UPPER(LR_TABLE.C_TABLE) = 'WEB_AUTH_CONFER' OR
UPPER(LR_TABLE.C_TABLE) = 'WEB_ORG_SALES') THEN
LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || ''')';
ELSE
LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || '''';
END IF; IF (i = 1) THEN
LB_SQL := 'DELETE FROM ZSSYS.' || LR_TABLE.C_TABLE || LB_COND;
ELSE
LB_SQL := 'INSERT INTO ZSSYS.' || LR_TABLE.C_TABLE || '(' ||
LB_COLS || ') SELECT ' || LB_COLS || ' FROM ' ||
'ZSSYS.' || LR_TABLE.C_TABLE || '@LINK_CORE' || LB_COND;
END IF;
EXECUTE IMMEDIATE LB_SQL; END LOOP;
IF CUR_TABLE%ISOPEN THEN
--close cursor
CLOSE CUR_TABLE;
END IF;
END LOOP;
END P_IMPORT_CHA_DATA;
/*****************************************************************************\
* Name: F_GET_LB_SQL
* PROCEDURE: 导生产环境基础数据(代理人信息)
* Return: LB_COND
* Programmer: lyt
* Date: 2019/10/24
* Update:
\*****************************************************************************/ FUNCTION F_GET_LB_SQL(C_TABLE IN VARCHAR2, --表名
IC_C_CHA_CDE IN VARCHAR2, --业务员编号
LB_COLS IN OUT CLOB --表对应字段
) RETURN CLOB IS
LB_COND CLOB := '';
BEGIN
SELECT WM_CONCAT(COLUMN_NAME)
INTO LB_COLS
FROM DBA_TAB_COLS@LINK_CORE
WHERE TABLE_NAME = UPPER(C_TABLE)
AND OWNER = 'ZSSYS'
ORDER BY COLUMN_ID; LB_COND := ' WHERE ';
IF (UPPER(C_TABLE) = 'WEB_CUS_COM_ACCT') THEN
LB_COND := LB_COND || 'C_REL_CDE ';
ELSIF (UPPER(C_TABLE) = 'WEB_CUS_CONFER') THEN
LB_COND := LB_COND || 'C_CLNT_CDE ';
ELSIF (UPPER(C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
UPPER(C_TABLE) = 'WEB_AUTH_CONFER') THEN
LB_COND := LB_COND ||
'C_AGT_AGR_NO IN (SELECT C_AGT_AGR_NO FROM ZSSYS.WEB_CUS_CONFER@LINK_CORE WHERE C_CLNT_CDE';
ELSIF (UPPER(C_TABLE) = 'WEB_ORG_SALES') THEN
LB_COND := LB_COND ||
'C_SLS_CDE IN(SELECT C_SLS_CDE FROM ZSSYS.WEB_CUS_CHA@LINK_CORE WHERE C_CHA_CDE';
ELSE
LB_COND := LB_COND || 'C_CHA_CDE ';
END IF; IF (UPPER(C_TABLE) = 'WEB_CUS_CONFER_DTL' OR
UPPER(C_TABLE) = 'WEB_AUTH_CONFER' OR
UPPER(C_TABLE) = 'WEB_ORG_SALES') THEN
LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || ''')';
ELSE
LB_COND := LB_COND || '= ''' || IC_C_CHA_CDE || '''';
END IF;
RETURN LB_COND;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('表:' || C_TABLE || '找不到');
END F_GET_LB_SQL;
/*****************************************************************************\
* Name: P_IMPORT_CHA_DATA2
* PROCEDURE: 导生产环境基础数据(代理人信息)
* Paramater: IC_C_CHA_CDE 代理人代码
* Programmer: lyt
* Date: 2019/10/24
* Update:
* 需导入表配置:T_IMPORT_TABLE WHERE C_MARK = '2';
* 如果手续费打包时提示:算税平台找不到该代理人,需联系算税平台(沈一栋)邵先路,将算税生产环境信息同步到对应环境
\*****************************************************************************/ PROCEDURE P_IMPORT_CHA_DATA2(IC_C_CHA_CDE VARCHAR2) AS
TYPE ref_cursor_type IS REF CURSOR;
CUR_TABLE ref_cursor_type;
LR_TABLE ZSSYS.T_IMPORT_TABLE%ROWTYPE;
LB_SQL CLOB;
LB_COLS CLOB;
LB_COND CLOB;
BEGIN
FOR i IN 1 .. 2 LOOP
--删除已有数据
IF (i = 1) THEN
OPEN CUR_TABLE FOR
SELECT *
FROM ZSSYS.T_IMPORT_TABLE
WHERE C_MARK = ''
ORDER BY C_TABLE_NO DESC;
LOOP
FETCH CUR_TABLE
INTO LR_TABLE;
EXIT WHEN CUR_TABLE%NOTFOUND;
LB_SQL := 'DELETE FROM ZSSYS.' || LR_TABLE.C_TABLE ||
F_GET_LB_SQL(LR_TABLE.C_TABLE, IC_C_CHA_CDE, LB_COLS);
EXECUTE IMMEDIATE LB_SQL;
END LOOP;
ELSE
--插入数据
OPEN CUR_TABLE FOR
SELECT *
FROM ZSSYS.T_IMPORT_TABLE
WHERE C_MARK = ''
ORDER BY C_TABLE_NO;
LOOP
FETCH CUR_TABLE
INTO LR_TABLE;
EXIT WHEN CUR_TABLE%NOTFOUND;
LB_COND := F_GET_LB_SQL(LR_TABLE.C_TABLE, IC_C_CHA_CDE, LB_COLS);
LB_SQL := 'INSERT INTO ZSSYS.' || LR_TABLE.C_TABLE || '(' ||
LB_COLS || ') SELECT ' || LB_COLS || ' FROM ' ||
'ZSSYS.' || LR_TABLE.C_TABLE || '@LINK_CORE' ||
LB_COND;
EXECUTE IMMEDIATE LB_SQL;
END LOOP;
END IF; IF CUR_TABLE%ISOPEN THEN
--close cursor
CLOSE CUR_TABLE;
END IF;
END LOOP;
END P_IMPORT_CHA_DATA2;
oracle中的存储过程(实例一)的更多相关文章
- oracle中print_table存储过程实例介绍
oracle中pro_print_table存储过程实例介绍 存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.这 ...
- 用sql语句导出oracle中的存储过程和函数
用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...
- Oracle中执行存储过程call和exec区别
Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...
- oracle 中的存储过程
oracle 中的存储过程 --oracle 中的存储过程, --不带任何参数的 CREATE OR REPLACE PROCEDURE PRO_TEST AS -- AS 和is 没有任何区别 ...
- oracle中的存储过程例子
用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获. . 建立一个存储过程 ...
- Oracle中job的实例
一.Oracle定时器(Job)各时间段写法汇总 对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等 ...
- Mybatis调用Oracle中的存储过程和function
一.Mybatis调用存储过程 1 在数据库中创建以下的存储过程create or replace procedure pro_hello(p_user_name in varchar2,p_resu ...
- Oracle中的存储过程简单例子
--创建表create table TESTTABLE( id1 VARCHAR2(12), name VARCHAR2(32))select t.id1,t.name from TESTTAB ...
- oracle中print_table存储过程介绍
一直以来,觉得MySQL中使用\G参数改变输出结果集的显示方式非常好用,尤其是在命令行界面.但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_t ...
随机推荐
- android7/8新特性 画中画、shortcut和分屏模式
多窗口 在android7.0中原生提供了多窗口模式和画中画模式,多窗口模式将屏幕分为上下或左右两块区域分别显示两个应用,画中画模式主要应用在android TV中,类似于windows中的多窗口. ...
- 爬虫中Selenium和PhantomJS
Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...
- GIT删除本地tag和远程tag
以tag test为例,这个tag已经同步到远程,但是现在发现了一个问题,需要撤回该tag,git命令如下: 删除本地tag: git tag -d test 删除远程tag: git push or ...
- LeetCode 108. Convert Sorted Array to Binary Search Tree (将有序数组转换成BST)
108. Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascendin ...
- 原生微信小程序脚手架(支持npm)
微信小程序支持npm 为了支持生态扩展,社区贡献者可以提供更加丰富的功能,已经支持了第三方小程序开发功能,见如下地址. 微信小程序支持npm https://developers.weixin.qq. ...
- 工控随笔_23_WinCC报Application CCArchiveConnMon.exe could not establish a connection to the Win CC license server
西门子的软件都是比较庞大的,安装一个软件要很长时间,而且安装的过程中很容易因为系统兼容性问题导致不能成功安装的情况, 而有时还会出现安装成功,但是不能正常使用的情况.这个时候就很麻烦,一般除了重装系统 ...
- FinalShell—一体化服务器管理软件(SSH客户端)
下面附上一些截图和官方连接: 官网:http://www.hostbuf.com/ FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发 ...
- redis 简单教程
一.redis的安装 安装环境:centos 7 1) 下载redis 这里我们下载的是redis-4.0.10.tar.gz 2)将redis tar包移动至 /usr/local 执行如下命令 c ...
- [xsy3553]游戏
题意:交互题,交互库有长为$n$的$01$串$S$,你可以用字符串$T$询问$\sum\limits_{i=1}^n[S_i=T_i]$,要求用$1030$次询问问出$S$,$n=5000$ 首先我们 ...
- strace调试工具编译移植
源码下载:https://github.com/strace/strace/releases/tag/v4.18(使用的较老版本,最新版 5.4 编译时依赖较多,最终博主放弃使用) [ 编译步骤 ] ...