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

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

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

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. 01-01基于SHELL的数据分析

    #!/usr/bin/env bash for year in /root/Downloads/data/all/* do echo -ne `basename $year .gz`"\t& ...

  2. SQLServer 学习笔记之超详细基础SQL语句 Part 4

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 3------------------- 17 带比较运算符的嵌套查询 ...

  3. flutter row 文字显示不全

    解决:在row层中的text层加一个expend flutter Row里面元素居中显示 new Expanded( flex: , child: new Row( children: <Wid ...

  4. UWP开发细节记录:DirectX::XMMATRIX 的坑

    这两天写的代码概率性的崩溃在 XMMatrixMultiply() 函数,XMMatrixMultiply() 本身是 inline 函数可以看到崩溃处的代码: vX = _mm_mul_ps(vX, ...

  5. python 元组编码和解码问题

    先看一个例子: (u'agentEnum', True, '200', {u'msg': u'\u6210\u529f', u'code': 1}) 在2.7.15版本中,如果有下面代码: def f ...

  6. ubuntu下编译qt5

    编译步骤参考: http://doc.qt.io/qt-5/linux.html 我们使用源代码和编译目录分离的编译方式, 这样避免编译主机系统和目标系统间的独立. 参考: Qt Configure ...

  7. Mbps Mb M Kb如何换算

    在传输单位的写法上,B 和 b 分别代表 Bytes 和 bits,两者的定义是不同的,具体换算公式如下:1 Byte = 8 bits 1 Kb = 1024 bits 1 KB = 1024 by ...

  8. 从零开始学习VoltDB

    1.什么是VoltDB? 是一个优化吞吐率的高性能集群开源SQLRDBMS(Database Management System),它是一个内存关系型数据库,既获得了nosql的良好可扩展性,高吞吐量 ...

  9. The Downside of MySQL Auto-reconnect

    A few days ago I was doing some cleanup on a passive master database using the MySQL client. I didn’ ...

  10. 自己动手制作一个本地的yum仓库

    制作本地yum源有两种方式,第一种是使用光盘镜像,然后在本地进行安装.第二种是我们自己创建一个本地yum仓库,然后使用file的形式来向本地提供yum repo(也可以使用http的方式向外部提供,我 ...