当表名和列名是动态的时,使用execute immediate时的增量提交

时间:2015-12-16 19:57:33

标签: oracle plsql commit execute-immediate

我需要更新几张桌子。要更新的表和列将从另一个表中获取。所以我在程序中的更新声明如下所示

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条记录之后执行提交。我怎么做?

1 个答案:

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