Я хочу использовать два исключения для значений имени и возраста, но это невозможный. 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;
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 или нет. Если они → исключение