我有几个必须动态执行的更新语句。我正在使用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();
答案 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状态的数量,那么可以使用此方法并循环来实现。