declare
type array is table of src%rowtype index by binary_integer;
l_data array ;
begin
loop
begin
select * bulk collect into l_data
from src
where processed = 'N'
and rownum < 10
for update of processed;
exit when sql%rowcount = 0;
exception
when no_data_found then exit;
end;
for i in 1 .. l_data.count
loop
update tgt set x = l_data(i).x , y = l_data(i).y where rowid = l_data(i).tgt_row_id ;
update src set processed = 'Y' where tgt_row_id = l_data(i).tgt_row_id;
end loop;
commit;
end loop;
end;
/
我编辑了代码以使用批量收集,但它只是挂在11.2。
SQL> select * from src;
X Y TGT_ROW_ID P
---------- ---------- ------------------ -
1 ABC AAAWZDAAEAAAA1EAAA Y
1 DEF AAAWZDAAEAAAA1EAAA Y
2 ABC AAAWZDAAEAAAA1EAAC Y
SQL> select * from tgt;
X Y
---------- ----------
1 ABC
1
2 ABC
答案 0 :(得分:1)
这里有几个问题。
1)第10行的错误。那是因为你需要使用BULK COLLECT来选择一个数组:
select x,y,tgt_row_id
bulk collect into l_data
from src
但是,由于l_data是使用src%rowtype
定义的,因此只有在表中只有3列x,y,tgt_row_id时才能使用上述内容。使用%rowtype
时,使用select *
实际上更好,因为它肯定会与记录结构匹配。
2)你的循环永远不会退出。你需要添加这样的东西:
loop
select * bulk collect into l_data
from src
where processed = 'N'
and rownum < 10
for update of processed;
exit when sql%rowcount = 0;
...
end loop;