Может ли оператор Execute Immediate быть вложенным в другой Execute Immediate - PullRequest
0 голосов
/ 09 октября 2018

У меня есть хранимая процедура, в которой Execute Immediate будет вызывать блок «Begin ... End», который содержит другой Execute Immediate, который будет вызываться только при выполнении определенного условия.

Внутреннее выполнениеНемедленная команда внутри «Begin ... End clock» заключена в одинарные кавычки.Таким образом, это выглядит так:

BEGIN
...SOME STUFF HERE...

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

END LOOP;

END;

Напрашивается другой вопрос: может ли оператор Execute Immediate быть вызван из цикла.Я думаю, что ответ - да.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Да, вы можете.

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

Я думаю, что это дорога в ад, но да, это возможно.

0 голосов
/ 09 октября 2018

Вы не показывали свой реальный код, однако я думаю, что такую ​​процедуру можно переписать, например, так:

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, но я не уверен.

...