在日常工作中,经常会碰到后台外导一批数据,并将外导数据处理至系统表中的情况。

面临这种情况,我一般采用写存储过程批处理的方式完成,写好一次以后,再次有导入需求时,只需要将数据导入到中间表,然后执行存储过程就搞定了。

以下是更新某个基础类型表(有上下自关联)的存储语句:

CREATE OR REPLACE PROCEDURE BSS_LS.PRO_IMP_RESPONSIBILITY
IS
CURR_PARENT_ID INT;
CURR_PARENT_NAME VARCHAR (200);
CURR_NAME VARCHAR (200);
CURR_REMARK VARCHAR (500); CURSOR RESP_CUR
IS
SELECT ONE, TWO, THREE FROM FOR_RESPONSIBILITY; --声明游标,表FOR_RESPONSIBILITY为外导的中间表 BEGIN
OPEN RESP_CUR; --打开游标 LOOP --遍历游标
FETCH RESP_CUR --遍历游标中每行字段值到对应的变量中
INTO CURR_PARENT_NAME, CURR_NAME, CURR_REMARK; EXIT WHEN RESP_CUR%NOTFOUND; --遍历完毕 退出 SELECT MAX (ID)
INTO CURR_PARENT_ID
FROM BSS_RESPONSIBILITY_BAK
WHERE NAME = CURR_PARENT_NAME; --查找上级ID IF CURR_PARENT_ID > 0 --找到ID,表BSS_RESPONSIBILITY_BAK为系统表
THEN
INSERT INTO BSS_RESPONSIBILITY_BAK (ID,
PARENT_ID,
NAME,
IS_USE,
REMARK)
VALUES (BSS_RESPONSIBILITY_SEQ.NEXTVAL,
CURR_PARENT_ID,
CURR_NAME,
1,
CURR_REMARK);
ELSE --未找到
SELECT BSS_RESPONSIBILITY_SEQ.NEXTVAL INTO CURR_PARENT_ID FROM DUAL; INSERT INTO BSS_RESPONSIBILITY_BAK (ID, NAME, IS_USE)
VALUES (CURR_PARENT_ID, CURR_PARENT_NAME, 1); INSERT INTO BSS_RESPONSIBILITY_BAK (ID,
PARENT_ID,
NAME,
IS_USE,
REMARK)
VALUES (BSS_RESPONSIBILITY_SEQ.NEXTVAL,
CURR_PARENT_ID,
CURR_NAME,
1,
CURR_REMARK); COMMIT;
END IF;
END LOOP; --结束遍历游标 CLOSE RESP_CUR; --关闭游标
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
RAISE;
END;
/

PS:游标的使用

游标声明方式有两种:

一、CURSOR  游标名 IS  select查询语句;

CURSOR your'sCursor IS select * from table

二、类型游标

TYPE my_cur_type IS REF CURSOR; -- 自定义一个游标类型
_cur my_cur_type ; -- 游标类型变量_cur -- ...
OPEN _cur FOR select * from table;
LOOP
FETCH _cur INTO _cur_id;
EXIT WHEN _cur%NOTFOUND; -- insert update select delete 等操作 END LOOP;
CLOSE _cur;

游标的行变量声明

--定义一个游标的行变量
_cur_row _cur%rowtype; --使用行中的值
fetch _cur into _cur_row;
_cur_row.xx1、 _cur_row.xx2
 

Oracle 存储过程procedure之数据更新-游标的更多相关文章

  1. Oracle存储过程procedure in、out、in out 模式参数【不发布,纯转】

    Oracle存储过程procedure in.out.in out 模式参数 Oracle存储过程基本语法介绍 注意存过不会自动提交,需要在存过本身添加commit; rollback;等语句

  2. Oracle存储过程中如何使用游标

    --本存储过程的功能:把test_tbl2中与test_tbl1中ID相同但salary不同的记录中的salary的值更新为test_tbl1中的salary的值--创建存储过程create or r ...

  3. Oracle 存储过程 PROCEDURE

    存储过程  一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一 ...

  4. Oracle存储过程procedure

    --给plsql块设置一个名称保存下来便于调用 /* Create or replace procedure 名称 As 声明变量 Begin //代码块 End; --plsql块 Declare ...

  5. Oracle存储过程Procedure语法及案例

    create or replace procedure replace(desstr in varchar2, replacestr in varchar2, tablename in varchar ...

  6. 用java 调用oracle存储过程总结

    SSM-Mybatis调用Oracle存储过程返回结果集(游标)示例 https://www.jianshu.com/p/0ae6d9d66d61 用java调用oracle存储过程总结 //1.ca ...

  7. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

  8. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  9. Oracle存储过程,游标使用

    Oracle存储过程: 语法: CREATE [OR REPLACE] PROCEDURE procedure_name (arg1 [mode1] datatype1,arg2 [mode2] da ...

随机推荐

  1. Python 多线程、多进程 (一)之 源码执行流程、GIL

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  2. codevs1735 方程的解数(meet in the middle)

    题意 题目链接 Sol 把前一半放在左边,后一半放在右边 meet in the middle一波 统计答案的时候开始想的是hash,然而MLE了两个点 实际上只要排序之后双指针扫一遍就行了 #inc ...

  3. VC工程从Win32环境往Win64环境迁移的经验总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先需要安装Win64的开发环境,具体参考: VS 2008的64位编译环境的安装和使用 其次在工程属性设置中作如下修 ...

  4. MBTIles实现

    MBTIles实现 3.1 Compliant(符合) python: raster2mb (write) python: mbutil (read/write) python: landez (wr ...

  5. 树莓派 温度监控 PWM 控制风扇 shell python c 语言

    Mine: 图中圈出来的是三极管 和滤波电容 依赖库: wiringPi sudo apt-get install wiringpi Shell脚本 本文介绍使用Shell脚本在树莓派上启用软件PWM ...

  6. MySql 正则表达式简介及使用

    MySql正则表达式简介及使用 by:授客 QQ:1033553122 简介 正则表达式描述了一组字符串,该字符放置于REGEXP工具后面.作用是将一个正则表达式与一个文本串进行比较. 最简单的正则表 ...

  7. Android--播放Gif的取巧办法

    由于做的项目,要有个动画的等待效果,第一时间想到的就是Gif(懒,省事),但是试了好多据说能播放Gif的控件,也写过,但是放到魅族手机上就是不能播放,所有就想了个招,既然Gif能在浏览器上播放,那an ...

  8. .NET(C#)使用Serialize、Deserialize序列和反序列化XML文档

    本文给大家分享一下C#操作(读取.写入)XML文档的实用方法,即用.NET本身提供的Deserialize和Serialize进行反序列化和序列化XML文档.这种方法主要是对比较规范的XML文档进行操 ...

  9. 负载均衡(Load Balancing)学习笔记(三)

    本文讲述实现负载均衡的常用算法. 轮询法(Round Robin) 轮询法是负载均衡中最常用的算法,它容易理解也容易实现.轮询法是指负载均衡服务器(load balancer)将客户端请求按顺序轮流分 ...

  10. 使用Fiddler模拟客户端http响应

    在客户端开发中,常常需要对一些特殊情况做处理,比如404.503等,又比如服务返回错误数据等.而测试这些情况会比较麻烦,往往都是找开发人员配合修改代码,这样效率不高. 接触到Fiddler之后,这样的 ...