基于行数更新

时间:2016-11-13 13:08:04

标签: database oracle plsql

嗨我想在行数的基础上对数据进行分块,但是在我尝试更新时我失败了

 declare 
temp varchar2(50);
low varchar2(50);
upp varchar2(50);
begin
low :=0;

for i in ( SELECT 
TO_CHAR(FLOOR(rownum/10) * 10) as low, TO_CHAR(FLOOR(rownum/10) * 10 + 10 -1 ) AS upp
FROM emp
GROUP BY FLOOR(rownum/10)
ORDER BY FLOOR(rownum/10))
loop


  update emp set thd=2     where rownum>i.low and rownum<i.upp;
  commit;
 low:=low+1;
  dbms_output.put_line(i.low|| i.upp);


end loop;
end;

代码正在更新前10个rec,但没有更新下一个周期20-30 30-40

任何猜测为什么

1 个答案:

答案 0 :(得分:1)

在oracle伪列rownum中返回一个数字,表示Oracle从表中选择行的顺序。您可以在rownum < n处使用。但rownum > n将始终返回空结果集。因为首先返回的行始终为rownum = 1,您希望它为> n。这就是为什么你没有更新行。 Documentation

如果您在表格中有一些ID,则可以这样做:

merge into emp e
using (select * from (select e2.*, row_number() over (order by id) r from emp e2) where r > 10 and r < 21) d
on (e.id = d.id)
when matched then update set thd = 2;

如果您没有ID,可以使用cursor for update