Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 立即执行中的多个更新_Oracle_Plsql_Oracle11g - Fatal编程技术网

Oracle 立即执行中的多个更新

Oracle 立即执行中的多个更新,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我有几个update语句需要动态执行。我使用executeimmediate执行这两个update语句。但是,当我这样做时,会出现以下错误: 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 immedia

我有几个update语句需要动态执行。我使用executeimmediate执行这两个update语句。但是,当我这样做时,会出现以下错误:

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中,是否存在不能执行多个update语句的限制

编辑:举例说明:

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;

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

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块馈送到
executeimmediate

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;

如果update语句是静态的,那么Frank建议的方法非常好。但如果update语句是动态的,那么您可以遵循下面的方法,即基于“;”拆分整个语句。然后分别对每个语句执行Immediate

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的数量也不固定,那么可以使用此方法和循环来实现这一点。

为什么需要
executeimmediate
?除非您不知道需要在编译时更新的列/表,否则静态PL/SQL将是更好的选择。我只举了一个例子来解释我所面临的问题。在此特定示例中,PK_1的值是一个变量。因此使用了executeimmediate。是的,我选择了第一种方法。但我想也许我错过了什么。谢谢