Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
402 Кб
Скачать
☆

Задача. Триггер контроля.

Дана таблица курсов валют. Необходимо написать триггер, который с помощью 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;

Также можно самомтоятельно разобрать статью:

http://www.sql.ru/faq/faq_topic.aspx?fid=513

Global temporary tables и переменные в заголовке пакета.

Global temporary tables.

Иногда необходимо в нескольких сессиях использовать одну и ту же таблицу, но при этом хранить в ней различные данные для каждой сессии. Для таких целей существуют временные таблицы - global temporary tables. Например, временные таблицы нужны для складирования промежуточных рассчетов отчета, который разные пользователи одновременно запускают в разных сессиях с различными параметрами.

Создадим временную таблицу:

create global temporary table TMP_TABLE_D(ID NUMBER)

on commit delete rows;

Опция 'on commit delete rows' означает, что после commit-а в сессии все строки из таблицы автоматически удаляются.

Если бы стояла опция 'on commit preserve rows', то после commit-а в сессии строки таблицы сохранялись бы неизменными.

Выполним в двух различных сессиях один и тот же блок кода. Во временную таблицу вставляются сгенерированные случайные значения, а затем в dbms_output выдается среднее значение вставленных id:

declare

avg_id number;

begin

for i in 1 .. 1000 loop

insert into tmp_table_d (id) values (1000 * dbms_random.value());

end loop;

select avg(id) into avg_id from tmp_table_d;

dbms_output.put_line('avg_id = ' || to_char(avg_id, '999.99'));

end;

В каждой из сессий данные в tmp_table_d получатся различные и значения avg_id вряд ли совпадут. Можно посмотреть эти данные запросом:

select * from tmp_table_d;

После выполнение команды

commit;

все данные в tmp_table_d исчезают, как, впрочем, исчезают и при logoff-е сессии.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]