提交循环

时间:2011-06-08 14:32:50

标签: oracle

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

1 个答案:

答案 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;