Oracle 立即执行中的多个更新
我有几个update语句需要动态执行。我使用executeimmediate执行这两个update语句。但是,当我这样做时,会出现以下错误: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
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。是的,我选择了第一种方法。但我想也许我错过了什么。谢谢