立即执行中的多个更新
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 常量中的;
怎么样?以上是关于立即执行中的多个更新的主要内容,如果未能解决你的问题,请参考以下文章