Oracle 存储过程procedure之数据更新-游标

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

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

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

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
 
原文地址:https://www.cnblogs.com/senyier/p/6611478.html