`

Oracle 分批提交DML

阅读更多
/*
参考于TOM编程艺术 8.5章在循环中提交

1.采用分批操作并不能提高执行速度,执行效率不如单条DML语句。
2.分批插入可以减少对undo空间的占用,但频繁的提交,可能会导致前面提交的undo空间被其他事务占用而可能导致ORA-0155错误。
3.若分批操作中间半截失败掉,会将你数据库置于一种未知的状态。(DELETE操作不会出现这种情况)

*/

--分批 update
DROP TABLE T2;

CREATE TABLE T2 AS SELECT OBJECT_NAME FROM DBA_OBJECTS;
SELECT * FROM T2;
SELECT COUNT(*) FROM T2;
--is table of 创建一个xx类型的数组
DECLARE
 TYPE RIDARRAY IS TABLE OF ROWID;
 TYPE VCARRAY IS TABLE OF T2.OBJECT_NAME%TYPE;
 L_RIDS RIDARRAY;
 L_NAMES VCARRAY;
 CURSOR C IS SELECT ROWID, OBJECT_NAME FROM T2;
 BEGIN
 OPEN C;
 LOOP
 FETCH C BULK COLLECT INTO L_RIDS, L_NAMES LIMIT 10;
 FORALL I IN 1 .. L_RIDS.COUNT
 UPDATE T2
 SET OBJECT_NAME = LOWER(L_NAMES(I))
 WHERE ROWID = L_RIDS(I);
 COMMIT;
 EXIT WHEN C%NOTFOUND;
 END LOOP;
 CLOSE C;
 END;
 
--分批delete
DROP TABLE T3;
CREATE TABLE T3 AS SELECT * FROM DBA_OBJECTS;
DECLARE  
   CURSOR MYCURSOR IS SELECT  ROWID FROM T3  ORDER BY ROWID;   --------按ROWID排序的CURSOR,删除条件是XXX=XXXX,根据实际情
   TYPE ROWID_TABLE_TYPE IS  TABLE OF ROWID INDEX BY PLS_INTEGER;
   V_ROWID  ROWID_TABLE_TYPE;
BEGIN
   OPEN MYCURSOR;
   LOOP
     FETCH  MYCURSOR BULK COLLECT INTO V_ROWID  LIMIT 5000;   --------每次处理5000行,也就是每5000行一提交
     EXIT WHEN V_ROWID.COUNT=0;
     FORALL I IN V_ROWID.FIRST..V_ROWID.LAST
        DELETE FROM T3  WHERE ROWID=V_ROWID(I);
     COMMIT;
   END LOOP;
   CLOSE MYCURSOR;
END;
/

--分批insert

DROP TABLE T4;
DROP TABLE T5;
CREATE TABLE T4 AS SELECT * FROM DBA_OBJECTS;
CREATE TABLE T5 AS SELECT * FROM T4 WHERE 1=0;
DECLARE  
   CURSOR MYCURSOR IS SELECT  ROWID FROM T4  ORDER BY ROWID;   --------按ROWID排序的CURSOR,删除条件是XXX=XXXX,根据实际情
   TYPE ROWID_TABLE_TYPE IS  TABLE OF ROWID INDEX BY PLS_INTEGER;
   V_ROWID  ROWID_TABLE_TYPE;
BEGIN
   OPEN MYCURSOR;
   LOOP
     FETCH  MYCURSOR BULK COLLECT INTO V_ROWID  LIMIT 5000;   --------每次处理5000行,也就是每5000行一提交
     EXIT WHEN V_ROWID.COUNT=0;
     FORALL I IN V_ROWID.FIRST..V_ROWID.LAST
        INSERT INTO T5 SELECT * FROM T4 WHERE ROWID=V_ROWID(I);
     COMMIT;
   END LOOP;
   CLOSE MYCURSOR;
END;

 

分享到:
评论

相关推荐

    批量更新删除插入SOURCEDATA.dml_task.zip_分批处理

    2. **事务管理**:在Oracle数据库中,频繁的提交可能导致undo空间被其他并发事务迅速覆盖,从而引发ORA-0155错误。这种错误表明撤销信息不再可用,因为撤销段已被重用。通过分批提交,可以延长undo记录的生命周期,...

    sqlserver自动生成sql语句工具sqlserver转oracle

    市场上存在许多这样的工具,如SSMA(SQL Server Migration Assistant) for Oracle,这是一个官方提供的迁移工具,能自动分析SQL Server的架构,并生成适合Oracle的DDL(Data Definition Language)和DML(Data ...

    ORACLE常用的SQL命令

    本文将详细介绍Oracle中常用的SQL命令,特别关注数据控制语句(DML)和数据定义语句(DDL)。 1. 数据控制语句 (DML) - INSERT:这是向表中插入新记录的基本命令。有两种形式: - 直接插入指定的值:`INSERT ...

    一个Oracle server process进程会消耗多少内存

    2. **分批次处理数据**:对于大型数据集,可以采用分批处理的方式,逐步处理数据,而不是一次性加载全部数据。 3. **优化SQL语句**:检查并优化SQL语句,减少不必要的数据加载和处理操作,从而降低内存消耗。 4. *...

    Oracle环境下根据条件大批量删除数据小程序

    Oracle是世界上最广泛使用的数据库管理系统之一,提供了丰富的SQL语法来处理数据,包括插入、更新、删除(DML)以及查询(SELECT)。在Oracle中,删除数据的命令是`DELETE`,但直接在生产环境中使用`DELETE`语句进行...

    Oracle的SQL语法大全

    大量数据更新可分批进行,期间适时`COMMIT`。 **二、数据定义 (DDL)** 1. **CREATE**: 创建数据库对象。Oracle支持多种数据类型,如`CHAR`、`VARCHAR2`、`NUMBER`和`DATE`。创建表时,小字段在前,可空字段在后,...

    oracle数据库常用操作指令

    针对Oracle数据库,常用的操作指令可以分为数据控制语句(DML)、数据定义语句(DDL)以及查询语句(SELECT)三个部分。 首先,数据控制语句(DML)部分包括插入(INSERT)、删除(DELETE)和更新(UPDATE)等基本...

    ORACLE数据库中插入大字段数据的解决方法

    - 使用`FORALL`语句与`BULK COLLECT`配合,可以避免循环中每次的DML操作,降低开销。 3. **绑定变量**: 当插入大量相似数据时,使用绑定变量能有效防止SQL语句硬解析,提高执行效率。例如,使用PL/SQL匿名块,将...

    Oracle 大数据量操作优化.pdf

    2. **批量更新与提交**:分批更新数据并及时提交事务可以减少对回滚段和临时表空间的占用。这有助于改善系统性能,避免长时间锁定资源。 3. **创建临时表空间**:创建一个大的临时表空间,专门用于处理这些大规模...

    数据库.Oracle.SQL与PLSQL Web

    在Oracle中,我们可以使用SQL DML(Data Manipulation Language)语句,如SELECT、INSERT、UPDATE和DELETE,来执行基本的数据操作。同时,SQL还包含了DDL(Data Definition Language)语句,如CREATE、ALTER和DROP,...

    oracle代码大全.docx

    本文将详细解析 Oracle 数据库中的 DML(数据操纵语言)和 DDL(数据定义语言)语句。 一、DML(数据控制语句) 1. INSERT:INSERT 语句用于向数据表中插入新记录。有两种基本形式: - 插入单个值:`INSERT INTO ...

    ORACLE常用指令

    确保在执行完DML语句后提交(COMMIT)以确保更改永久保存,或在需要撤销时回滚(ROLLBACK)。 二、数据定义语句(DDL) 1. CREATE: CREATE语句用于创建数据库对象,如表、索引、视图、同义词、过程、函数和数据库...

    Oracle设计规范.docx

    - 对于大数据量的操作,应分批处理,每次操作的数量不宜过大。 **5.6 完成事务及时commit** - 对于已完成的事务,应及时提交,以减少锁争用。 **5.7 Java的变量绑定** - 使用Java中的变量绑定技术来提高SQL执行...

    oracle常用SQL语句(汇总版).docx

    对于海量数据,建议分批处理,并在每次操作后提交(`COMMIT`)。 - 表命名推荐使用英文,且字段顺序和约束设计需谨慎,以优化存储和查询性能。 了解和熟练掌握这些Oracle SQL语句,将有助于您在日常数据库管理中...

    oracle代码大全.pdf

    本文将深入探讨在Oracle中执行数据控制(DML)和数据定义(DDL)操作的关键知识点。 一、数据控制语句(DML) 1. INSERT INSERT语句用于向数据表中插入新记录。有两种基本形式: - 插入指定的值:`INSERT INTO ...

    oracle常用函数汇总.pdf

    本文主要汇总了Oracle中的常用SQL语句,包括数据控制语句(DML)和数据定义语句(DDL)中的关键函数和操作。 一、数据控制语句(DML) 1. INSERT语句: - 插入单行数据:`INSERT INTO 表名(字段名1, 字段名2, ......

    oracle_sql语句[借鉴].pdf

    Oracle SQL语句是数据库管理中不可或缺的部分,尤其在软件开发领域。本文主要涵盖了数据控制语句(DML)和数据定义语句(DDL)...对于大型表的操作,可分批处理,并在合适时机提交COMMIT,以确保操作效率和数据一致性。

    ORACLE 常用的SQL语法和数据对象

    对于大数据量的INSERT、DELETE和UPDATE,推荐分批处理,每次操作后使用COMMIT,以提高系统效率和响应速度。同时,合理的索引设计和表结构优化也是提高性能的关键。在实际使用中,应结合Oracle的文档和最佳实践,确保...

Global site tag (gtag.js) - Google Analytics