Отображать пользовательское сообщение при нарушении ограничения 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.

Поделитесь и наслаждайтесь.

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