Sql 分页Oracle更新查询

Sql 分页Oracle更新查询,sql,database,oracle,plsql,oracle11g,Sql,Database,Oracle,Plsql,Oracle11g,我有一个更新查询 UPDATE tablename set column1 = 'value1', column2= 'value2', column3= 'value3' where column4 = 'value4 我需要修改上述声明,以便: 每5000条记录提交一次 在总共更新500000行后停止 在oracle11g中可能吗?我们如何才能做到这一点 编写了一个SQL过程: DECLARE fromCount number(10) := 0; toCount number(

我有一个更新查询

UPDATE tablename
set column1 = 'value1', column2= 'value2', column3= 'value3'
where column4 = 'value4
我需要修改上述声明,以便:

  • 每5000条记录提交一次
  • 在总共更新500000行后停止
  • 在oracle11g中可能吗?我们如何才能做到这一点

    编写了一个SQL过程:

    DECLARE
    fromCount   number(10) := 0;
    toCount     number(10) := 0;
    BEGIN 
        LOOP
            toCount := fromCount + 5000;
    
          UPDATE tablename
        set column1 = 'value1', column2= 'value2', column3= 'value3'
        where column4 = 'value4 AND ROWNUM > fromCount AND ROWNUM < toCount;
    
            COMMIT;
    
            IF toCount=500000 THEN
                EXIT;
            END IF;
        END LOOP;
    END;
    
    声明
    fromCount编号(10):=0;
    总数(10):=0;
    开始
    环
    toCount:=fromCount+5000;
    更新表名
    设置column1='value1',column2='value2',column3='value3'
    其中column4='value4和ROWNUM>fromCount和ROWNUM

    执行它需要1个多小时。如何提高它的性能?

    您可以使用'和rownum为它使用存储过程。语句是原子的,它必须完全成功或完全失败。每5000行提交一条SQL语句是没有意义的。您可以编写一些PL/SQL来迭代要更新的行,并包括临时提交,但这几乎总是一个错误。这会减慢您的流程,使其更加复杂,需要您进行大量的内务管理以使流程可重新启动,等等。为什么您希望这样做,而不是让Oracle一次更新您希望它更新的所有行?限制和偏移概念如何?我们能用它来实现吗?我对它了解不多你想解决什么问题<代码>限制和偏移量在11g中不存在。12c引入了
    偏移量
    先取|后取
    。我想您可以使用PL/SQL中的行来选择要更新的行(尽管这很可能会使解决方案更加复杂),但不能在
    update
    语句本身中进行选择。你为什么需要它?当然,这不是出于性能原因,因为它会更慢。您是否试图在Oracle上使用MySQL或MSSQL中的某种模式?如果您真的坚持这样做,您必须使用PL/SQL并使用
    updatetable\u name SET\u子句,其中cursor\u name的当前值