【问题标题】:Incremental commit while using execute immediate when table name and column name are dynamic当表名和列名是动态时,使用立即执行时的增量提交
【发布时间】:2016-03-23 02:49:10
【问题描述】:

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

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

【问题讨论】:

  • 为什么要在每n条记录后提交?
  • 用谷歌搜索你,你知道什么。 community.oracle.com/thread/937361?tstart=0
  • 您的意思是对于那个 single 更新语句,您希望它更新的任何行都分批提交吗?不重写update 语句不仅是不可能的,而且这是一个坏主意。为什么要破坏更新的事务性?
  • @user3224907 我知道如何为更新语句执行此操作,但我想知道当我的更新通过立即执行完成时如何执行此操作。
  • 只需制作COMMIT;EXECUTE IMMEDIATE 'COMMIT'; 也可以,但绝对没有必要用动态 SQL 来做

标签: oracle plsql commit execute-immediate


【解决方案1】:

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

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多