1

我需要更新一些表。要更新的表和列将从另一个表中获取。所以我在过程中的更新语句看起来像这样

EXECUTE IMMEDIATE
        'UPDATE '
     || In_owner
     || '.'
     || In_table_name
     || ' upd_tbl '
     || ' SET '
     || In_sql_stmt_col_list
     || ' WHERE '
     || In_sql_stmt_where_clause;

如您所见,表名、set 子句和 where 子句都是动态构建的。我现在要做的是在每 n 条记录后执行一次提交。我怎么做?

4

1 回答 1

0

假设您能够从未更新中识别更新的行,您可以尝试将以下示例适合您的情况。

nbatchsize是您每次要提交的行数。
是在最后一个循环中更新的i行数。更新由 while 循环,直到更新的行数低于您的nbatchsize. 当然,只有当您能够从未更新的行中识别出已经更新的行时,它才会起作用。In_sql_stmt_col_list如果您没有任何lastupdateon列,您可以使用它。

declare 
nbatchsize number := 10;
i number := nbatchsize;
begin


while i >= nbatchsize 
loop 

EXECUTE IMMEDIATE '
update 
Table 
set lastupdateon = sysdate  
where 
lastupdateon < sysdate -1
and rownum <= :1 ' using nbatchsize;

 i := sql%rowcount;

commit;  
dbms_output.put_line(i);

end loop;

end;
于 2015-12-17T06:10:25.243 回答