嗨我想在行数的基础上对数据进行分块,但是在我尝试更新时我失败了
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
任何猜测为什么
答案 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
。