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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM