【问题标题】:Can an Execute Immediate statement be nested inside another Execute ImmediateExecute Immediate 语句可以嵌套在另一个 Execute Immediate 中吗
【发布时间】:2019-03-14 16:09:13
【问题描述】:

我有一个存储过程,其中 Execute Immediate 将调用“Begin ... End”块,其中包含另一个 Execute Immediate,只有在满足特定条件时才会调用。

“Begin... End clock”中的内部 Execute Immediate 命令用单引号括起来。所以看起来像

BEGIN
...SOME STUFF HERE...

FOR ..... LOOP
EXECUTE IMMEDIATE
           'BEGIN
              IF (condition) THEN
                     EXECUTE IMMEDIATE 'DML STRING'
              END IF
            END;'

END LOOP;

END;

这引出了另一个问题,是否可以从循环中调用 Execute Immediate 语句。我认为答案是肯定的。

【问题讨论】:

  • 试试吧,让我们知道会发生什么!
  • 我认为一般来说它应该可以工作,但你可能会遇到一些引号问题。我建议检查您的设计并避免嵌套字符串。
  • 只是因为它打扰了我(对不起):en.wikipedia.org/wiki/Begging_the_question

标签: oracle stored-procedures plsql dynamic-sql


【解决方案1】:

你没有展示你的真实代码,但是我认为这样的过程可以重写,例如:

DECLARE
   res BOOLEAN
BEGIN
...SOME STUFF HERE...

FOR ..... LOOP
   EXECUTE IMMEDIATE 'BEGIN res := '||condition||'; END;' USING OUT res;
   IF res THEN
      EXECUTE IMMEDIATE 'DML STRING';
   END IF;

END LOOP;

END;

注意,在早期版本中,USING res 仅适用于本机 SQL 数据类型,即 BOOLEAN 或 PL/SQL 类型是不可能的。据我所知,该功能是在 Oracle 12.1 中添加的,但我不确定。

【讨论】:

  • 感谢您的快速回复。不幸的是,我使用的是 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0。所以基本问题仍然存在。 Execute Immediate 可以嵌套吗?
  • 然后重塑返回1/0而不是TRUE/FALSE的条件,并根据IF res = 1 THEN ...运行第二条命令
【解决方案2】:

是的,你可以。

begin
    execute immediate
        'begin
             execute immediate ''begin dbms_output.put_line(''''Hello''''); end;'';
         end;';
end;

我认为这是通往地狱的道路,但是是的,这是可能的。

【讨论】:

  • 地狱之路1+。
猜你喜欢
  • 2021-04-15
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2010-11-03
  • 2015-10-07
  • 2021-11-20
相关资源
最近更新 更多