
- •Язык pl/sql
- •Блоки программы pl/sql
- •Основы программирования на языке pl/sql
- •Переменные программы
- •Управление ходом выполнения программы
- •Взаимодействие с базами данных
- •Объявление и использование подпрограмм: процедуры и функции
- •Работа с переменными типа запись
- •Атрибуты %type и %rowtype
- •Работа с курсорами
- •Встроенные пакеты утилит
- •Триггеры баз данных
- •Упражнение 4.21. Создание и использование триггеров базы данных
Упражнение 4.21. Создание и использование триггеров базы данных
Введите приведенную ниже директиву CREATETRIGGER для создания триггера DML. который автоматически заносит в журнал некоторую базовую информацию о DML-изменениях, внесенных в таблицу PARTS. Триггер logPartChanges находится за директивой триггера, который срабатывает один раз после директивы срабатывания, независимо от того, на какое количество строк он воздействует.
□ CREATE OR REPLACE TRIGGER logPartChanges AFTER INSERT OR UPDATE OR DELETE ON parts DECLARE
l_statementType CHAR(l); BEGIN IF INSERTING THEN l_stateinentType := 'I'; ELSIF UPDATING THEN l_sta'tementType := 'У ; ELSE l_statementType := ' D' END IF;
INSERT INTO partsLogVALUES (SYSDATE, l_statementType. USER) ENDipgPartChanges; /
Обратите внимание на то, что если в триггере logPartChanges срабатывание возможно от различных типов команд, то предикаты INSERTING, UPDATING^ DEIJiTINGпозволяют определить тип команды, от которой в действительности сработал триггер.
Теперь создайте триггер logDetailedPartChanges, который принадлежит к послестроковому типу и заносит в журнал подробную информацию о DML-изменениях, внесенных в таблицу PARTS. Этот триггер срабатывает один раз для каждой строки, на которую распространяется директива срабатывания триггера.
□ CREATE OR REPLACE TRIGGER logDetailedPartChanges AFTER INSERT OR UPDATE OR DELETE ON parts
FOR EACH ROW BEGIN INSERT INTO oetaileapartslog (changedateuserid,
newid, newdescription, newunitprice. newonhand, newreprder, oldid, olddescription, oldumtprice. oldonhand. oldreorder) VALUES (SYSDATE. USER, .new.id, :new.description :new.unitprice :new.onhand, :new.reerder, ;old.id. ;old.descriptipn, :pld.. unitprice, ;old.onhand, :old.reorder); tNDlogDetailedPartChanges;
ПримечаниеКак возможный вариант триггер строки может включать в себя ограничение, т.е. логическое условие его срабатывания.
Обратите внимание на то, что в триггере logDetailedPartChangesзначения корреляции :newи soldпозволяют триггеру строки получать доступ к прежнему и новому значениям текущей строки. Если директивой триггера является команда INSERT, то все прежние значения полей не определены (имеют значение null). Аналогичным образом, если директивой триггера является команда DELETE, то все новые значения полей имеют значение null.
В заключение проверьте как работают ваши новые триггеры и какие операции они выполняют. Введите приведенные ниже SQL-команды, которые вставляют, обновляют и удаляют строки таблицы PARTS и делают запрос к таблицам PARTSLOG и DETAILEDPARTSLOG:
О INSERT INTO parts
(id, description, unitprice, onhand. reorder) VALUES (6. "Mouse' , 49, 1200, 500):
UPDATE parts SET onhand = onhand - 10:
DELETE FROM parts WHERE id = 6:
SELECT - FROM partsLog;
SELECT newid. newonhand, oloid. oldonha.nd FROM detailedpartslog:
Текст результирующих таблиц этих запросов должен быть аналогичен приведенному ниже:
□ CHANGEDATE С USERID
03-DEC-05 I ANONYMOUS 03-DEC-05 U ANONYMOUS 03-DEC-05 D ANONYMOUS
NEWID NEWONHAND 0LDID 0LD0NHAND
6 1200
267 1 277
133 2 143
7621 3 7631
5893 4 5903
5 480 5 490
6 1190 .6 1200
6 1190
При использовании триггеров баз данных необходимо учитывать, что триггеры DML работают в рамках текущей транзакции. Поэтому при попытке сделать откат транзакции при последовательном осуществлении
запросов к таблицам PARTSLOG и DETAILEDPARTSLOG вы увидите сообщение "norowsselected" («строки не выбраны»). Проверьте это самостоятельно.
Итоги
В данной главе был представлен обзор широких возможностей, предлагаемых языком PL/SQL для создания мощных программ доступа к базам данных. Читатель познакомился с основами самого языка, а также приобрел опыт в создании программ PL/SQL, использующих хранимые процедуры, функции, пакеты и триггеры баз данных. Вы также приобрели ценный опыт в использовании страницы команд SQL утилиты OracleApplicationExpress и увидели некоторые ее отличия от SQL*Plus.