Обработка ошибок и динамический sql

jonik
Дата: 13.11.2008 11:27:24
Oracle 10g r2
Есть некая процедура проверки - Check, в случае не прохождения проверки генерируется exception "NO_ACTION". Exception объявлен в другом пакете.
Процедруа Check используется в ряде процедур - Проц1 ...ПроцN.
Есть главная процедура Main, в которой через динамический sql (execute immediate) запускаются процедуры Проц1 ...ПроцN.
В Main есть обработка исключений, но в блоке EXCEPTION не происходит обработки исключение NO_ACTION, если в процедуре Check инициируется исключение NO_ACTION.

Исключение NO_ACTION пользовательское.
Генерировалось как Raise NO_ACTION.
Начал искать пути решения.
Сделал Через EXCEPTION_INIT и связал генерирую ошибку уже через Raise_application_error, но все равно не работает.

Но если связываю исключение, с кодом ошибки НЕ из диапазона пользовательских ошибок, то все нормально работает.
Вопрос: можно ли как то заставить чтобы работало с пользовательскими ошибками ?? Если нет, то решение использовать код стандартной ошибки Oracle будет приемлемым или нет ??
Может существует еще какое нибудь решение ??
orawish
Дата: 13.11.2008 11:32:24
jonik
..Может существует еще какое нибудь решение ??

raise_application_error
andrey_anonymous
Дата: 13.11.2008 11:45:59
create or replace package ane_test_main as
  no_action exception;
  pragma exception_init(no_action,-20001);
  procedure main;
end;
/

create or replace package body ane_test_main as
  procedure main is
  begin
    execute immediate 'begin ane_test_worker.checkIt; end;';
  exception
    when no_action then
      dbms_output.put_line('It''s no_action handler');
  end;
end;
/

create or replace package ane_test_worker as
  procedure checkIt;
end;
/

create or replace package body ane_test_worker as
  procedure checkIt is
  begin
    raise ane_test_main.no_action;
  end;
end;
/
SQL> set serveroutput on
SQL> exec ane_test_main.main;
 
It's no_action handler
 
PL/SQL procedure successfully completed
 
SQL> 
jonik
Дата: 13.11.2008 11:46:21
orawish

raise_application_error

да я так и делаю или я не понял что ты имел ввиду
Wladislaw
Дата: 13.11.2008 11:48:26
В какой из процедур делали EXCEPTION_INIT? Надеюсь и в той где генерили ошибку и в той где обрабатывали? Или они у вас все в одном пакете и прагма в декларативной части пакета?
jonik
Дата: 13.11.2008 11:58:34
to andrey_anonymous
Как проверял я :(
CREATE OR REPLACE PACKAGE SLR_EXC AS
   no_calc          exception;
   err_code_no_calc number := -20001;
   PRAGMA EXCEPTION_INIT(no_calc, -20001);
END SLR_EXC;
/

declare
begin
  begin
    --execute immediate 'RAISE_APPLICATION_ERROR(-20001, ''''упс'''');';
    --execute immediate 'RAISE_APPLICATION_ERROR(SLR_EXC.err_code_no_calc, ''''упс'''');';
    execute immediate 'RAISE SLR_EXC.no_calc;';
  exception
  when others then raise;
  end;
  exception
  when SLR_EXC.no_calc          
    then DBMS_OUTPUT.PUT_LINE('ok');
  when OTHERS          
    then DBMS_OUTPUT.PUT_LINE('no ok');
 
end;
----- Result
no ok
Вячеслав Любомудров
Дата: 13.11.2008 12:02:54
Про BEGIN-END не забыл?
orawish
Дата: 13.11.2008 12:04:45
jonik
orawish

raise_application_error

да я так и делаю или я не понял что ты имел ввиду

как вы делаете - можно было только догадываться, а вот теперь уже и стало видно..
откройте для себя sqlcode/sqlerrm
Вячеслав Любомудров
Дата: 13.11.2008 12:05:43
Кстати, мог бы выводить не пустую строку, а sqlerrm, например. Сразу бы и понятней стало
Elic
Дата: 13.11.2008 12:07:57
jonik
Есть главная процедура Main, в которой через динамический sql (execute immediate) запускаются процедуры Проц1 ...ПроцN.
В Main есть обработка исключений, но в блоке EXCEPTION не происходит обработки исключение NO_ACTION, если в процедуре Check инициируется исключение NO_ACTION.

Исключение NO_ACTION пользовательское.
Генерировалось как Raise NO_ACTION.
STFF user-defined exception & NDS :)