我需要更新几张桌子。要更新的表和列将从另一个表中获取。所以我在程序中的更新声明如下所示
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条记录之后执行提交。我怎么做?
答案 0 :(得分:0)
假设您能够识别未更新的更新行,您可以尝试将以下示例放入您的案例中。
nbatchsize
是您每次要提交的行数
i
是在最后一个循环中更新的行数。
更新循环,直到更新行数低于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;