您的位置:首页 > 数据库 > Oracle

About Oracle 分批DML

2020-04-02 19:06 1606 查看

Oracle 分批DML

1、分批Insert

DECLARE
TYPE RIDARRAY IS TABLE OF ROWID INDEX BY PLS_INTEGER;
V_ROWID RIDARRAY;
CURSOR IB_INSERT IS SELECT ROWID FROM CQ_TEST_OBJECTS_TABLE_BAK ORDER BY ROWID; --rowid不能从视图中select

V_COUNTS NUMBER := 0; --变量定义并赋值
V_START_TIME DATE;
V_END_TIME DATE;

BEGIN
SELECT SYSDATE INTO V_START_TIME FROM DUAL;
OPEN IB_INSERT;
LOOP
FETCH IB_INSERT BULK COLLECT INTO V_ROWID LIMIT 50000; --limit限制每次操作的行数
EXIT WHEN V_ROWID.COUNT = 0;
FORALL I IN V_ROWID.FIRST .. V_ROWID.LAST
INSERT INTO CQ_TEST_OBJECTS_TABLE SELECT * FROM CQ_TEST_OBJECTS_TABLE_BAK T WHERE T.ROWID=V_ROWID(I);
COMMIT;
--V_COUNTS := V_COUNTS+TO_CHAR(SQL%ROWCOUNT);
END LOOP;
CLOSE IB_INSERT;
SELECT SYSDATE INTO V_END_TIME FROM DUAL;
DBMS_OUTPUT.put_line(V_START_TIME||' 至 '||V_END_TIME||' 插入数据 '||V_COUNTS||'行。');
COMMIT;
END;
/

2、分批Update

DECLARE
TYPE RIDARRAY IS TABLE OF ROWID;
TYPE VCARRAY  IS TABLE OF CQ_TEST_OBJECTS_TABLE.OBJECT_TYPE%TYPE; --%TYPE前边是属性列
L_RIDS RIDARRAY;
L_CNAMES VCARRAY;
CURSOR IB_UPDATE IS SELECT ROWID,OBJECT_TYPE FROM CQ_TEST_OBJECTS_TABLE;
BEGIN
OPEN IB_UPDATE; --FETCH ... INTO 需要显示开启游标
LOOP
FETCH IB_UPDATE BULK COLLECT INTO L_RIDS,L_CNAMES LIMIT 10; --BULK COLLECT批量处理,limit
FORALL I IN 1 .. L_RIDS.COUNT
UPDATE CQ_TEST_OBJECTS_TABLE SET OBJECT_TYPE = LOWER(L_CNAMES(I)) WHERE ROWID = L_RIDS(I); --批update
COMMIT;
EXIT WHEN IB_UPDATE%NOTFOUND;
END LOOP;
CLOSE IB_UPDATE; --FETCH ... INTO 需要显示关闭游标
END;
/

3、分批Delete

DECLARE
COUNTS INT;
TYPE RIDARRAY IS TABLE OF ROWID INDEX BY PLS_INTEGER;
V_ROWID RIDARRAY;
CURSOR IB_DELETE IS SELECT ROWID FROM CQ_TEST_OBJECTS_TABLE ORDER BY ROWID;
BEGIN
COUNTS := 0;
OPEN IB_DELETE;
LOOP
FETCH IB_DELETE BULK COLLECT INTO V_ROWID LIMIT 5000; --每次处理5000行
EXIT WHEN V_ROWID.COUNT=0;
FORALL I IN V_ROWID.FIRST .. V_ROWID.LAST
DELETE FROM CQ_TEST_OBJECTS_TABLE WHERE ROWID = V_ROWID(I); --根据实际修改删除数据的条件
COMMIT;
COUNTS := COUNTS+1;
DBMS_OUTPUT.put_line(COUNTS||' Commit!');
END LOOP;
CLOSE IB_DELETE;
END;
/
  • PRO_INSERT_INBATCHES
CREATE OR REPLACE PROCEDURE PRO_INSERT_INBATCHES AS
TYPE RIDARRAY IS TABLE OF ROWID INDEX BY PLS_INTEGER;
V_ROWID RIDARRAY;
CURSOR IB_INSERT IS SELECT ROWID FROM CQ_TEST_OBJECTS_TABLE_BAK ORDER BY ROWID;

V_COUNTS NUMBER := 0;
V_START_TIME DATE;
V_END_TIME DATE;
BEGIN
SELECT SYSDATE INTO V_START_TIME FROM DUAL;
OPEN IB_INSERT;
LOOP
FETCH IB_INSERT BULK COLLECT INTO V_ROWID LIMIT 50000;
EXIT WHEN V_ROWID.COUNT = 0;
FORALL I IN V_ROWID.FIRST .. V_ROWID.LAST
INSERT INTO CQ_TEST_OBJECTS_TABLE SELECT * FROM CQ_TEST_OBJECTS_TABLE_BAK T WHERE T.ROWID=V_ROWID(I);
COMMIT;
--V_COUNTS := V_COUNTS+TO_CHAR(SQL%ROWCOUNT);
END LOOP;
CLOSE IB_INSERT;
SELECT SYSDATE INTO V_END_TIME FROM DUAL;
DBMS_OUTPUT.put_line(V_START_TIME||' 至 '||V_END_TIME||' 插入数据 '||V_COUNTS||'行。');
COMMIT;
END PRO_INSERT_INBATCHES;
  • PRO_UPDATE_INBATCHES
CREATE OR REPLACE PROCEDURE PRO_UPDATE_INBATCHES AS

TYPE RIDARRAY IS TABLE OF ROWID;
TYPE VCARRAY  IS TABLE OF CQ_TEST_OBJECTS_TABLE.OBJECT_TYPE%TYPE;
L_RIDS RIDARRAY;
L_CNAMES VCARRAY;
CURSOR IB_UPDATE IS SELECT ROWID,OBJECT_TYPE FROM CQ_TEST_OBJECTS_TABLE;

BEGIN
OPEN IB_UPDATE;
LOOP
FETCH IB_UPDATE BULK COLLECT INTO L_RIDS,L_CNAMES LIMIT 10;
FORALL I IN 1 .. L_RIDS.COUNT
UPDATE CQ_TEST_OBJECTS_TABLE SET OBJECT_TYPE = LOWER(L_CNAMES(I)) WHERE ROWID = L_RIDS(I);
COMMIT;
EXIT WHEN IB_UPDATE%NOTFOUND;
END LOOP;
CLOSE IB_UPDATE;
END PRO_UPDATE_INBATCHES;
  • PRO_DELETE_INBATCHES
CREATE OR REPLACE PROCEDURE PRO_DELETE_INBATCHES AS

COUNTS INT;
TYPE RIDARRAY IS TABLE OF ROWID INDEX BY PLS_INTEGER;
V_ROWID RIDARRAY;
CURSOR IB_DELETE IS SELECT ROWID FROM CQ_TEST_OBJECTS_TABLE ORDER BY ROWID;
BEGIN
COUNTS := 0;
OPEN IB_DELETE;
LOOP
FETCH IB_DELETE BULK COLLECT INTO V_ROWID LIMIT 5000; --每次处理5000行
EXIT WHEN V_ROWID.COUNT=0;
FORALL I IN V_ROWID.FIRST .. V_ROWID.LAST
DELETE FROM CQ_TEST_OBJECTS_TABLE WHERE ROWID = V_ROWID(I); --根据实际修改删除数据的条件
COMMIT;
COUNTS := COUNTS+1;
DBMS_OUTPUT.put_line(COUNTS||' Commit!');
END LOOP;
CLOSE IB_DELETE;
END PRO_DELETE_INBATCHES;
  • 点赞
  • 收藏
  • 分享
  • 文章举报
ddttoop 发布了68 篇原创文章 · 获赞 3 · 访问量 1141 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: