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
我需要修改上述声明,以便:
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的当前值代码>