立即执行中的多个更新

Posted

技术标签:

【中文标题】立即执行中的多个更新【英文标题】:Multiple updates in execute immediate 【发布时间】:2015-09-24 09:07:14 【问题描述】:

我有几个必须动态执行的更新语句。我正在使用立即执行来执行这两个更新语句。但是,当我这样做时出现以下错误:

ORA-00911: invalid character
ORA-06512: at line 7
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than ..

Execute immediate 中是否有不能执行超过 1 个更新语句的限制?

编辑:举例:

begin 
EXECUTE IMMEDIATE 'UPDATE tt_TGT_TABLE SET PK_1 = ''Demand10'' where ROW_ID = 3923866 ; UPDATE tt_TGT_TABLE SET PK_1 = ''Demand11'' where ROW_ID = 3923868'; 
end;

【问题讨论】:

你为什么需要EXECUTE IMMEDIATE?除非您不知道在编译时需要更新的列/表,否则静态 PL/SQL 将是更好的选择。 是的,我明白了。我只构建了一个示例来解释我面临的问题。在这个特定的例子中,PK_1 的值是一个变量。因此使用立即执行。 【参考方案1】:

您不能简单地在 EXECUTE IMMEDIATE 调用中连接多个语句 - 您必须使用多个调用:

begin 
  EXECUTE IMMEDIATE 'UPDATE tt_TGT_TABLE SET PK_1 = ''Demand10'' where ROW_ID = 3923866';
  EXECUTE IMMEDIATE 'UPDATE tt_TGT_TABLE SET PK_1 = ''Demand11'' where ROW_ID = 3923868'; 
end;

或将匿名 PL/SQL 块输入EXECUTE IMMEDIATE

begin 
  EXECUTE IMMEDIATE '
    begin
      UPDATE tt_TGT_TABLE SET PK_1 = ''Demand10'' where ROW_ID = 3923866;
      UPDATE tt_TGT_TABLE SET PK_1 = ''Demand11'' where ROW_ID = 3923868;
    end;';   
end;

【讨论】:

是的,我选择了第一种方法。但我想也许我错过了一些东西。谢谢【参考方案2】:

如果更新语句是静态的,那么 Frank 建议的方式非常好。但是,如果更新语句是动态的,那么您可以遵循以下方法,其中基于 ';' 拆分整个语句。然后对每条语句分别执行immendiate。

BEGIN
V_INIPOSITION :=1;
V_SQL:= 'UPDATE tt_TGT_TABLE SET PK_1 = ''Demand10'' where ROW_ID = 3923866;UPDATE tt_TGT_TABLE SET PK_1 = ''Demand11'' where ROW_ID = 3923868';
SELECT LENGTH(V_SQL) INTO V_LEN FROM DUAL;
SELECT INSTR(V_SQL,';',v_iniposition,1) INTO V_FINALPOSITION FROM DUAL;
SELECT SUBSTR (V_SQL,V_INIPOSITION, v_finalposition-1) INTO V_QUERY FROM DUAL;
EXECUTE IMMEDIATE (V_QUERY);
SELECT SUBSTR (V_SQL,v_finalposition+1, V_LEN) INTO V_QUERY FROM DUAL;
EXECUTE IMMEDIATE (V_QUERY);
End;

如果 SQL statemets 的数量也不是固定的,那么可以使用这种方法和循环来实现。

【讨论】:

cmets 和 char 常量中的 ; 怎么样?

以上是关于立即执行中的多个更新的主要内容,如果未能解决你的问题,请参考以下文章

在 redux store 更新后立即执行自定义回调

通过 for 循环执行立即更新

Vue.nextTick DOM 更新循环结束之后执行延迟回调

pl/sql : 执行立即更新?

执行立即更新返回 NULL 而非字符串查询工作正常

React Hooks:使用useState更新状态不会立即更新状态[重复]