Два исключения в одном модуле

Я хочу использовать два исключения для значений имени и возраста, но это невозможный. 100 — это код NO_DATA_FOUND.

create or replace ....) 
IS
  

    age_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(age_excep , 100);
    name_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(name_excep, 100);
BEGIN
.
.
.
.
EXCEPTION
    WHEN name_excep THEN
  
       DBMS_OUTPUT.PUT_LINE('Empty name : ');

    WHEN age_excep THEN --- HERE IS THE ERROR.IT SAYS THAT "YOU MUST PUT name_excep AND age_excep IN SAME EXEPTION (PLS-00484)
  
       DBMS_OUTPUT.PUT_LINE('Empty age: ');
    

END;
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

100 — это код NO_DATA_FOUND.

Хм, это не так, но только если вы работаете в режиме ANSI. По умолчанию ваша база данных будет в режиме Oracle, и в этом NO_DATA_FOUND выбрасывается ORA-01403.

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

Следовательно, вам нужно изменить свою программу.

Первый вариант (и лучший) - указать номера исключений из диапазона, назначенного пользовательским исключениям, от -20999 до -20000.

    age_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(age_excep , -20000);
    name_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(name_excep, -20001);

Это позволит вам явно вызывать именованное исключение в коде и обрабатывать его в блоке исключений.

EXCEPTION
    WHEN name_excep THEN
       DBMS_OUTPUT.PUT_LINE('Empty name : ');

    WHEN age_excep THEN 
       DBMS_OUTPUT.PUT_LINE('Empty age: ');
    

END;

Работает ли это для вас, зависит от характера кода в опущенном разделе, который вы разместили: как вы проверяете ИМЯ и ВОЗРАСТ? Две разные программы? SQL или PL/SQL? Если вам нужна дополнительная помощь, вам нужно опубликовать еще немного кода.

Второй вариант - иметь одно исключение для обработки обоих:

    age_name_excep EXCEPTION; 
    PRAGMA EXCEPTION_INIT(age_name_excep , -100);

Вам понадобится более общий обработчик ошибок:

EXCEPTION
    WHEN age_name_excep THEN
  
       if name is null then 
           DBMS_OUTPUT.PUT_LINE('Empty name : ');
       else
           DBMS_OUTPUT.PUT_LINE('Empty age: ');
       end if;
END;

Согласен, довольно неуклюжий, поэтому первый вариант лучше.


Между прочим, «обработка» исключений путем отображения сообщения вполне допустима для упражнения, но в реальной жизни считается плохой практикой. Сообщения DDBMS_OUTPUT могут быть подавлены или невидимы для пользователей в большинстве рабочих сред. Лучший подход — зарегистрировать ошибку в таблице (или файле) базы данных, а затем повторно вызвать исключение в вызывающей программе. В большинстве случаев решение о том, как обрабатывать исключения, является прерогативой вызывающей программы (или конечного пользователя).

Спасибо за ваш ответ @APC.У меня есть два Select.... ВЫБЕРИТЕ name1 INTO name FROM Group WHERE name1 = "Example";..... и... ВЫБЕРИТЕ age1 INTO age FROM Group WHERE age1 = "50"; Итак, после каждого выбора я хочу знать, являются ли имя или возраст NULL или нет. Если они → исключение

readJohn 11.12.2020 12:07

Другие вопросы по теме