Дана таблица курсов валют. Необходимо написать триггер, который с помощью raise_application_error выдает информационные ошибки при некорректных изменениях (insert, update, delete) в таблице курсов, которые осуществляет пользователь из интерфейса:
- при вставке нулевого или отрицательного курса
- при отсутствии в записи одного из полей (даты, валюты, курса)
- при удалении записи о курсе
Создадим таблицу курсов:
CREATE TABLE KK_RATE
(
RATE_DATE DATE,
CURRENCY_CODE INTEGER,
RATE NUMBER(6,2)
);
Создадим триггер контроля:
create or replace trigger trig_biud_rate
before insert or update or delete on kk_rate
for each row
begin
if inserting or updating then
-- запрет неположительных курсов
if :new.rate <= 0 then
raise_application_error(-20001,
'Курс должен быть строго положительным');
end if;
-- запрет null-значений
if :new.rate_date is null or :new.currency_code is null or
:new.rate is null then
raise_application_error(-20002, 'Заполните все поля');
end if;
elsif deleting then
-- запрет удаления
raise_application_error(-20003,
'Нельзя удалять курсы');
end if;
end trig_biud_rate;
Диапазон пользовательских кодов ошибок, генерируемых с помощью raise_application_error: от -20000 до -20999.
Проверим работу триггера, будем выполнять команды по одной:
insert into kk_rate(rate_date, currency_code, rate) values(to_date('21.06.2012','dd.mm.yyyy'), 840, 32.91);
insert into kk_rate(rate_date, currency_code, rate) values(to_date('22.06.2012','dd.mm.yyyy'), 840, 32.91);
insert into kk_rate(rate_date, currency_code, rate) values(to_date('23.06.2012','dd.mm.yyyy'), 978, -41.72);
update kk_rate set rate = 0 where rate_date = to_date('22.06.2012','dd.mm.yyyy') and currency_code = 840;
insert into kk_rate(rate_date, currency_code, rate) values(to_date('23.06.2012','dd.mm.yyyy'), 978, null);
insert into kk_rate(rate_date, currency_code, rate) values(null, 978, 76.92);
delete from kk_rate where rate_date = to_date('22.06.2012','dd.mm.yyyy') and currency_code = 840;
delete from kk_rate;
Также можно самостоятельно разобрать статью о мутациях: