вызвать процедуру внутри исключения - PullRequest
0 голосов
/ 18 октября 2018

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

    procedure p1 is
    begin
      begin
        select 1 from dual;
      exception
        when no_data_found then
          p2;
      end;
    end;
    end p1;

    procedure p2 is
    [process..]
    end p2;
    begin
        p1;
    end;
    /

Ответы [ 3 ]

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

Вы можете создать «анонимную» (скажем, вложенную) процедуру p2 внутри p1:

create or replace procedure p1 
is
    c INT;

    procedure p2 is
    begin
       DBMS_OUTPUT.put_line('Procedure p2');
    end p2;
begin
    select 1 INTO c from dual where 1=0;
    exception
    when no_data_found then
      p2;
end p1;
//

db <> fiddle demo

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

Вы можете объявить процедуры внутри анонимного блока PL / SQL.Любые процедуры, которые вы объявляете внутри анонимного блока PL / SQL, будут существовать только внутри этого блока и будут видны только внутри этого блока.

Например, (бесстыдно крадет код для p1 и p2 от LittleFoot):

DECLARE
   -- Forward declaration for p2, so p1 can see it.  
   -- Alternatively, you could just put the whole definition of p2 here instead.
   procedure p2;

   procedure p1 as
      l_dummy number(1);
    begin
      select 1 into l_dummy from dual where 1 = 2;
    exception
      when no_data_found then
        p2;
    end p1;

    procedure p2 as
      l_dummy number(1);
    begin
      select 3 into l_dummy from dual;
      dbms_output.put_line('P2: selected value = ' || l_dummy);
    end p2;


BEGIN
      p1;
END;
0 голосов
/ 18 октября 2018

Нет проблем в этом;однако, если вы хотите запустить анонимный фрагмент кода, то это не хранимая процедура , потому что они названы (то есть не анонимны).

Вот пример:

SQL> create or replace procedure p1 as
  2    l_dummy number(1);
  3  begin
  4    select 1 into l_dummy from dual where 1 = 2;
  5  exception
  6    when no_data_found then
  7      begin
  8        select 2 into l_dummy from dual;
  9        dbms_output.put_line('Exception, selected value = ' || l_dummy);
 10      end;
 11  end;
 12  /

Procedure created.

SQL> set serveroutput on
SQL> begin
  2    p1;
  3  end;
  4  /
Exception, selected value = 2

PL/SQL procedure successfully completed.

SQL>

Если вы хотите вызвать хранимую процедуру, проблем тоже нет:

SQL> create or replace procedure p2 as
  2    l_dummy number(1);
  3  begin
  4    select 3 into l_dummy from dual;
  5    dbms_output.put_line('P2: selected value = ' || l_dummy);
  6  end;
  7  /

Procedure created.

SQL> create or replace procedure p1 as
  2    l_dummy number(1);
  3  begin
  4    select 1 into l_dummy from dual where 1 = 2;
  5  exception
  6    when no_data_found then
  7      p2;
  8  end;
  9  /

Procedure created.

SQL> begin
  2    p1;
  3  end;
  4  /
P2: selected value = 3

PL/SQL procedure successfully completed.

SQL>

Как видите, оба вариантаработа.

...