Блок PL / SQL не выполняется до конца при использовании EXECUTE IMMEDIATE - PullRequest
0 голосов
/ 07 января 2020

Чего я пытаюсь достичь?

  • Я хотел бы скопировать Oracle процедур от одного пользователя к другому, используя PL / SQL.
  • Я хотел бы скопировать все процедуры, в том числе с ошибками компиляции.

Где я застрял?

  • После того, как EXECUTE IMMEDIATE создаст процедура с ошибками компиляции, блок PL / SQL больше не выполняется.
  • Нет исключения!

Следующие два блока кода демонстрируют проблему. Первый блок выполняется как ожидалось. Второй блок не выполняется полностью. Процедура p3 с ошибкой компиляции не является проблемой. Моя проблема в том, что процедура p4 не создана.

-- creates procedure p1 and p2
BEGIN

  EXECUTE IMMEDIATE 'create or replace procedure p1 is begin null; end;';
  EXECUTE IMMEDIATE 'create or replace procedure p2 is begin null; end;';

  dbms_output.put_line('Done!');

END;
-- creates only procedure p3 and exits with no error
BEGIN

  EXECUTE IMMEDIATE 'create or replace procedure p3 is begin null end;'; -- compilation error (missing semicolon)
  EXECUTE IMMEDIATE 'create or replace procedure p4 is begin null; end;';

  dbms_output.put_line('Done!');

END;

Ответы [ 2 ]

3 голосов
/ 07 января 2020

К go более подробно об ответе Боба: если вы хотите игнорировать исключения компиляции, вам нужно обернуть каждый execute immediate в анонимный блок.

BEGIN

  BEGIN
    EXECUTE IMMEDIATE 'create or replace procedure p3 is begin null end;'; -- compilation error (missing semicolon)
  EXCEPTION WHEN OTHERS THEN null; -- ignore exceptions
  END;

  BEGIN
    EXECUTE IMMEDIATE 'create or replace procedure p4 is begin null; end;';
  EXCEPTION WHEN OTHERS THEN null; -- ignore exceptions
  END;

  dbms_output.put_line('Done!');

END;
3 голосов
/ 07 января 2020

Да, возникает исключение. Вы видите, «Успех с ошибкой компиляции» IS исключение. Вы можете поймать его, определив переменную исключения и инициализировав ее, используя EXCEPTION_INIT:

eCompilation_error EXCEPTION;
PRAGMA EXCEPTION_INIT(eCompilation_error, -24344);

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...