在日常工作中,經常會碰到后台外導一批數據,並將外導數據處理至系統表中的情況。
面臨這種情況,我一般采用寫存儲過程批處理的方式完成,寫好一次以后,再次有導入需求時,只需要將數據導入到中間表,然后執行存儲過程就搞定了。
以下是更新某個基礎類型表(有上下自關聯)的存儲語句:
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