2014-11-03 2 views
0

Допустит, я звоню процедуру PLSQL из другой процедуры (все определенно в том же пакете)PLSQL распространяющегося/повышение исключения из подпрограммы/блока

Я пытаюсь вызвать ошибку приложения из proc1 будет отображаться на aC# program (proc1 будет вызовом записи), когда что-то пойдет не так. Его прямо, когда исключение происходит в proc1. Но как распространять ту же ошибку, которая возникает в proc2?

Должен ли я объявлять тот же самый пользовательский пример EXCEPTION в proc1? Или Должен ли я иметь глобальную переменную исключения на уровне пакета? Какая стандартная практика? (PLS игнорировать любые ошибки код такой EXCEPTION_INIT и т.д ..) я только включили код для концепции ..

 create or replace procedure proc1 is 
    begin 

      --some plsqlcode 
      proc2(); 

    exception 
     raise_application_error(????); 
    end proc1; 

    create or replace procedure proc2 is 
    user_exception EXCEPTION; 
    begin 
    --do something 
    if (somefalse condition) then 
     raise user_exception 
    exception 
     when user_exception then 
     --do some error handling 
     raise; 
    end proc2; 

Я надеюсь, что я был ясно обрамление вопроса. Заранее благодарим за предложения/советы.

ответ

1

Если у вас есть пакет, стандартная практика заключается в объявлении исключения в пакете.

create or replace package pkg is 
    user_exception exception; 

    procedure proc1; 
    procedure proc2; 
end pkg; 

create or replace package body pkg is 
    procedure proc1 is 
    begin 
    proc2; 
    exception 
    when user_exception then 
     raise; 
    end; 

    procedure proc2 is 
    begin 
    raise user_exception; 
    end; 
end pkg; 
1

Одно из решений заключается в объявлении исключения, так это видно в обеих процедурах:

user_exception EXCEPTION; 

create or replace procedure proc1 is 
begin 

    --some plsqlcode 
    proc2(); 

exception 
    when user_exception then    -- added 
    raise_application_error(????); -- added 
    when others then 
    raise_application_error(????); 
end proc1; 

create or replace procedure proc2 is 
begin 
--do something 
if (somefalse condition) then 
    raise user_exception 
exception 
    when user_exception then 
    --do some error handling 
    raise; 
end proc2; 

Делите и наслаждайтесь.

+0

Боб, это стандартная практика? Я могу определенно объявить исключение в спецификации пакета. – cableload

+0

Если исключение не должно быть видимым за пределами корпуса пакета (т. Е. Используется только процедурами внутри корпуса пакета), я просто поместил его в тело пакета. И да, я бы сказал, что это стандартная практика - я использую подобные объявления в пакетах, которые я пишу все время. Поделитесь и наслаждайтесь. –

+0

Спасибо, Боб. Оно работает ! – cableload

Смежные вопросы