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;
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- SQL语言四大类:DQL,DML,DDL,DCL
- hadoop学习之HIVE(3.3):hiveSQL语句详解(DML)
- org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
- Oracle的闪回技术--闪回错误的DML操作
- JAVAWEB开发之数据库简介、MySQL的安装与卸载(处理中文乱码)、以及MySQL语言(DDL、DML、DCL、DQL)的详解和使用
- 14.管理表中的数据DML语句
- 单机11g ogg 双向DML复制
- MySQL中的DDL语句,DML语句初步
- SQL中的四种语言DML DDL DCL TCL
- DML、DDL、DCL区别
- 闪回之 Flashback Query (dml表、过程、函数、包等)、Flashback version Query
- MySQL的DDL语句、DML语句与DCL语句
- 微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据 下篇
- SQL中的四种语言DDL,DML,DCL,TCL
- 列对象+创建对象类型+使用对象类型定义表中的列/DML操作
- DQL、DML、DDL、DCL的概念与区别
- MySQL DML操作--------合并查询结果实战
- MySQL中的DDL、DML、DCL、DQL
- 数据库DML语句insert
- SQL之DDL,DCL,DML,TCL