在日常工作中,经常会碰到后台外导一批数据,并将外导数据处理至系统表中的情况。
面临这种情况,我一般采用写存储过程批处理的方式完成,写好一次以后,再次有导入需求时,只需要将数据导入到中间表,然后执行存储过程就搞定了。
以下是更新某个基础类型表(有上下自关联)的存储语句:
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