ITPub博客

首页 > 数据库 > Oracle > Oracle分批提交DML

Oracle分批提交DML

Oracle 作者:zangqianglei 时间:2015-05-12 13:49:32 0 删除 编辑

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方法相同不再演示。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25954236/viewspace-1650224/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: ORACLE一些巡检sql
请登录后发表评论 登录
全部评论

注册时间:2015-02-06

  • 博文量
    22
  • 访问量
    104123