可以将Execute Instant语句嵌套在另一个Execute Instant中

时间:2018-10-09 20:01:42

标签: oracle stored-procedures plsql dynamic-sql

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

“开始...结束时钟”内部的内部“立即执行”命令用单引号引起来。所以看起来像

BEGIN
...SOME STUFF HERE...

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

END LOOP;

END;

另一个难题是,是否可以从循环内部调用Execute Instant语句。我认为答案是肯定的。

2 个答案:

答案 0 :(得分:4)

是的,可以。

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

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

答案 1 :(得分:0)

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

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中添加的,但我不确定。