При использовании sqlerm и исключения в oracle apex выдается повторяющийся код ошибки - PullRequest
2 голосов
/ 26 марта 2019

Я создаю процесс в Oracle Apex 5.0.Пожалуйста, помогите мне избавиться от повторяющихся кодов ошибок.

У меня есть несколько условий, когда необходимо выдать ошибку.Но в конце блока, когда я записываю Exception блок с sqlerrm, он выдает код ошибки два раза.

begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise_application_error(-20001, '----statement1----');

    elseif(<condition 3>) then
        raise_application_error(-20002), '----statement2----');

    end if;

exception
    when others then
        raise_application_error(-20003, SQLERM);
end;

Теперь, если из-за этих операторов IF произойдет какая-либо ошибка, результат будет выглядеть как

ORA-20001: ORA-20003: ----statement1----.

Но мне нужно показать как, например:

ORA-20001: ----statement1----

Как я могу получить это?Пожалуйста, помогите мне найти то, что я должен сделать здесь.

1 Ответ

3 голосов
/ 26 марта 2019

RAISE_APPLICATION_ERROR выдает ошибку на заказ.Но, как и любое другое исключение, которое может вызвать наше приложение, оно перехватывается локальным обработчиком исключений.

Ваш обработчик исключений вызывает новое сделанное на заказ исключение для любых ошибок.Не делай этого.Вы можете легко решить вашу проблему, удалив блок исключения.Все исключения будут распространяться вверх по стеку вызовов без каких-либо изменений.

begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise_application_error(-20001, '----statement1----');

    elseif(<condition 3>) then
        raise_application_error(-20002), '----statement2----');

    end if;

end;

Кроме того, вы можете использовать определяемые пользователем исключения.

declare
    x_condition2 exception;
    x_condition3 exception;
begin
    -----------------------------
    -----some code statements----
    -----------------------------

    if (<condition 1>) then
        -----------------
        ----some code----
        -----------------

    elsif(<condition 2>) then
        raise x_condition2;

    elseif(<condition 3>) then
        raise x_condition3;

    end if;

exception
    when x_condition2 then
        raise_application_error(-20001, '----statement1----');
    when x_condition3 then
        raise_application_error(-20002, '----statement2----');

end;

Вам все равно не нужно беспокоиться, КОГДА ДРУГИЕесли у вас нет какой-то конкретной обработки , которую вы хотите применить ко всем ошибкам (таким как их регистрация).Нет смысла просто повторно вызывать исключение в секции обработчика, потому что распространение происходит по умолчанию.


@ Deep ask

не можем ли мы сделать оба исключения?

Да, мы можем сделать это:

declare
    x_condition2 exception; 
    PRAGMA EXCEPTION_INIT(x_condition2,-20001); 
    x_condition3 exception; 
    PRAGMA EXCEPTION_INIT(x_condition3,-20002);
….

Объявление исключения создает исключение на заказ.PRAGMA EXCEPTION_INIT связывает заказной номер ошибки с этим исключением.Я бы не стал делать это в анонимном блоке, потому что мы не получаем от этого особой выгоды.Нам все еще нужно было бы выполнить raise_application_error, чтобы вернуть наши специальные сообщения об ошибках.

Когда pragma exception_init становится действительно полезным, когда мы передаем исключения между программными модулями.Исключения, которые должны обрабатываться вызывающими программами, должны быть объявлены в спецификациях пакета.Использование pragma exception_init означает, что мы можем идентифицировать ошибки, используя sqlcode, что может быть полезно для таких задач, как поиск стандартных сообщений об ошибках из таблицы, предоставление текста справки пользователя и т. Д.

...