Отображать пользовательское сообщение при нарушении ограничения PL/SQL
Я пишу процедуру PL / SQL. У меня есть ограничение на столбец, который не допускает значения ниже 0 и выше 500. Мне нужно отобразить пользовательское сообщение, если это ограничение нарушено (например, "ID вне диапазона"). В настоящее время это исключение, а также выход в получении. Есть еще одна процедура, которая выводит ошибку, поэтому используется поднятьрастание_платформы.
исключение
when VALUE_ERROR then
raise_application_error(-20002, 'Customer ID out of range');
Сообщение об ошибке
"ORA-20000: ORA-02290: check constraint (s5849497.CK_ID_RANGE) violated"
Что бы я хотел
"ORA-20000: Customer ID out or range"
Вот целый блок, если это поможет
set serveroutput on;
---------------------------------------------------------------
alter table customer
add constraint ck_id_range
check (custid > 0 and custid < 500);
---------------------------------------------------------------
create or replace procedure ADD_CUSTOMER_TO_DB(pcustid number, pcustname varchar2) as
begin
insert into customer
values (pcustid,pcustname,0,'OK');
exception
when DUP_VAL_ON_INDEX then
raise_application_error(-20001, 'Duplicate customer ID');
when VALUE_ERROR then
raise_application_error(-20002, 'Customer ID out of range');
when others then
raise_application_error(-20000, SQLERRM);
end;
Спасибо
1 ответ
Я предполагаю, что вы получаете ошибку ORA-02290. Чтобы поймать это в обработчике исключений, нужно объявить и инициализировать исключение для конкретного кода ошибки (в данном случае -2290), а затем использовать пользовательское исключение в обработчике:
create or replace procedure ADD_CUSTOMER_TO_DB(pcustid number,
pcustname varchar2)
as
eCheck_constraint_violated EXCEPTION;
PRAGMA EXCEPTION_INIT(eCheck_constraint_violated, -2290);
begin
insert into customer
values (pcustid,pcustname,0,'OK');
exception
when DUP_VAL_ON_INDEX then
raise_application_error(-20001, 'Duplicate customer ID');
when eCheck_constraint_violated then
raise_application_error(-20002, 'Customer ID out of range');
when others then
raise_application_error(-20000, SQLERRM);
end;
Как вы увидите выше, я просто заменил VALUE_ERROR на недавно определенное исключение.
Если случайно вы получаете ошибку не -2290, просто поместите ошибку, которую вы видите в PRAGMA EXCEPTION_INIT
вызов выше вместо -2290.
Поделитесь и наслаждайтесь.