我有一个存储过程,其中一个“执行立即执行”将调用“ 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语句。我认为答案是肯定的。
答案 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中添加的,但我不确定。