立即执行多个更新

时间:2015-09-24 09:07:15

标签: oracle plsql oracle11g

我有几个必须动态执行的更新语句。我正在使用execute immediate执行这两个更新语句。但是,当我这样做时,我收到以下错误:

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中无法执行多于1个更新语句?

编辑:举例:

new SXSSFWorkbook();

2 个答案:

答案 0 :(得分:4)

您不能简单地在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;

答案 1 :(得分:0)

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

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状态的数量,那么可以使用此方法并循环来实现。