Рассмотрим создание простого пакета catMgmt, демонстрирующего функции, доступные пакетам PL/SQL. Сначала нужно создать спецификацию пакета:
Далее создайте тело пакета, используя приведенную ниже директиву.
Теперь введите анонимный блок PL/SQL, использующий процедуру insertCat пакета catMgmt для вставки новой строки в таблицу Catalogs:
Обратите внимание на то, что при ссылке на объект типа пакет (на глобальную переменную или подпрограмму) необходимо использовать точечную нотацию для идентификации объекта пакета по имени самого пакета.
Введите анонимный блок для изменения названия нового каталога на «Разное» с использованием процедуры updateCat пакета catMgmt.
Теперь введите анонимный блок PL/SQL для выполнения процедуры deleteCat пакета catMgmt, которая удаляет новую часть таблицыCatalogs.
В заключение введите анонимный блок для вывода количества строк таблицы Catalogs, обработанных в текущем сеансе с помощью пакета catMgmt.
Процедура printCatProcessed показывает, что глобальная переменная g_rowsProcessed сохраняет свое состояние независимо от обращений к отдельным подпрограммам пакета.
Команда EXECUTE представляет собой другой способ выполнения PL/SQL-подпрограмм. Вызывая функцию, необходимо создать переменную для присвоения ей возвращаемого функцией значения.
Oracle включает несколько встроенных пакетов утилит, которые предоставляют полезные средства разработки приложений. В таблице описаны некоторые встроенные пакеты, доступные в базах данных Oracle.
Имя пакета |
Описание |
DBMS_ALERT
DBMS_AQ DBMS_AQADM DBMS_CRYPTO
DBMS_DESCRIBE
DBMS_LOB
DBMS_LOCK
DBMS_METADATA
DBMS_OUTPUT
DBMS_PIPE
DBMS_RANDOM
DBMS_ROWID
DBMS_SCHEDULER DBMS_SESSION
DBMS_SPACE
DBMS_STATS
DBMS_TRANSACTION UTL_FILE
UTL_HTTP
UTL_SMTP |
Процедуры и функции, позволяющие приложениям сообщать об аварийных ситуациях с указанием их типа без опроса Процедуры и функции для установки очередности выполнения транзакций и администрирования механизмов установки очередности Процедуры и функции для шифрования и расшифровки данных на диске в условиях, когда необходимо обеспечить защиту данных Процедуры и функции для описания API для хранимых процедур ифункций Процедуры и функции для операций с данными типов BLOB,CLOB, NCLOBи BFILE Процедуры и функции, позволяющие приложениям координировать доступ к совместно используемым ресурсам Процедуры и функции для извлечения метаданных об объектах схемы из словаря базы данных, такого как XML или SQLDDL Процедуры и функции, позволяющие программе PL/SQL генерировать вывод на терминал Процедуры и функции, позволяющие сеансам баз данных осуществлять связь между собой через коммуникационные каналы (pipes) Процедуры и функции для генерирования случайных чисел и строк для приложений Процедуры и функции, позволяющие приложениям легко интерпретировать базовый 64-символьный тип ROWID Процедуры и функции для создания расписания выполнения работ Процедуры и функции для управления сеансом пользователя приложения Процедуры и функции для анализа использования пространствадля хранения и оценки требований к нему Процедуры и функции для поддержки статистики, помогающей оптимизировать выполнение команд SQL Процедуры для ограниченного контроля транзакций Процедуры и функции для чтения и записи текстовых файлов в файловую систему сервера Процедуры и функции для получения доступа к данным по протоколу передачи гипертекста (HypertextTransferProtocol–HTTP) Процедуры и функции для отправки электронной почты по простому протоколу передачи почты (SimpleMailTransferProtocol– SMTP) |
Триггером базы данных называется хранимая процедура, которая выполняется, когда происходит некоторое событие. Самым распространенным типом триггера, который вы можете использовать, является триггер DML, который связан с конкретной таблицей; когда приложение обращается к таблице с помощью команды SQLDML, удовлетворяющей условиям срабатывания триггера, Oracle автоматически запускает триггер для выполнения этой операции. Триггеры используются для настройки реакции Oracle на события приложения.
Примечание Oracle также поддерживает триггеры, которые срабатывают в ответ на события на уровне базы данных и на уровне схемы. Более подробная информация об этих типах триггеров приведена в Справочнике по командам SQLдля баз данных Oracle.
Для создания триггера DML используется SQL-команда CREATETRIGGER. Упрощенный (неполный) синтаксискоманды CREATE TRIGGER имеетвид:
О CREATE [OR REPLACE] TRIGGER trigger{BEFORE|AFTER} {DELETEfINSERT|UPDATE [OF column [.column] ... ]}
[OR {DELETE|INSERT|UPDATE [OF column [.column] ... J} ] ... ON table
FOR EACH ROW [WHEN condition] ] ... PL/SGL block . . . END [trigger]
Определение триггера DML-включает в себя следующие уникальные части:
Определение триггера включает в себя список директив триггера, включая команды INSERT, LTPDATE и/или DELETE, вызывающие срабатывание триггера. Триггер связан с одной и только одной таблицей. ,
Срабатывание триггера может происходить до его директивы или после, в зависимости от логики приложения.
Б определении триггера указывается, является ли он триггером директивы или триггером строки. Триггер директивы срабатывает только один раз, независимо оттого, на сколько строк распространяется его действие.
Введите приведенную ниже директиву 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.