
- •Лекция 14 Хранимый код. Триггеры
- •14.1. Процедурные расширения языка sql
- •Операторы языка pl/sql
- •1. Оператор присваивания
- •2. Условный оператор
- •3. Операторы цикла
- •14.2. Использование команд sql в процедурном расширении. Курсоры
- •14.3 Хранимые процедуры и функции
- •Преимущества и недостатки хранимого кода
- •Создание хранимых процедур и функций
- •Примеры хранимых процедур и функций
- •14.4. Триггеры
- •Особенности триггеров
- •Команды sql для работы с триггерами
- •Примеры триггеров
- •1. Триггер на вставку нового студента
- •2. Триггеры на удаление студента
- •3. Триггер на изменение оценки
14.3 Хранимые процедуры и функции
Хранимые процедуры и функции являются стандартными объектами базы данных. Их понимание в SQL не отличается от общепринятого: хранимой подпрограммой (процедурой или функцией) называется именованная, отдельно описанная, повторно используемая программная единица, выполняющая, как правило, определенную прикладную функцию.
Преимущества и недостатки хранимого кода
В современных информационных системах значительная часть бизнес-логики содержится в хранимом коде. Хранимые подпрограммы обеспечивают приложениям баз данных следующие преимущества:
сокращение объема программирования при разработке приложений, так как однажды созданная подпрограмма может использоваться разными приложениями;
уменьшение сетевого трафика, так как, если подпрограмма включает в себя несколько обращений к базе данных, по сети передается не каждый запрос и его результат, а только вызов процедуры и ее конечный результат;
повышение производительности, так как на сервере есть больше возможностей оптимизации локально выполняющихся запросов и здесь могут быть применены средства, недоступные для клиентской части;
гарантия того, что задача, решаемая хранимой процедурой, будет одинаково выполняться для всех клиентских приложений и для всех клиентских платформ при любых настройках клиентов.
Основным недостатком хранимого кода является его непереносимость между различными СУБД. В силу этого, для масштабируемых информационных систем или систем, предназначенных для многократного тиражирования, часто используется трехзвенная архитектура системы с переносом значительной части бизнес-логики на уровень сервера приложений. Практикуется и такой вариант: серверная часть тиражируемой информационной системы разрабатывается сразу для нескольких самых распространенных СУБД (например, вариант для Oracle, PostgreSQL и Microsoft SQL Server).
Следует отметить, что хранимые процедуры и функции не следует рассматривать как альтернативу сложным SQL-запросам. По сравнению с «чистым» SQL любая процедурная альтернатива является худшим вариантом с точки зрения производительности, поскольку SQL-запросы любая СУБД обрабатывает с наивысшей эффективностью. Поэтому не нужно поддаваться соблазну и переходить на уровень процедурной логики там, где можно, пусть ценой больших мыслительных усилий, написать сложный, но эффективный запрос с использованием только средств языка SQL.
Создание хранимых процедур и функций
В Oracle традиционно основным языком хранимых процедур является язык PL/SQL, но поддерживаются и процедуры на других языках, прежде всего - на языках C++ и Java. В последнем случае хранимая процедура или функция называется внешней. В рамках нашего курса рассмотрим основной вариант – хранимая процедура на PL/SQL.
Хранимая процедура создается оператором SQL
CREATE [OR REPLACE] PROCEDURE имя[(список_параметров)]
AS
блок PL/SQL
Необязательная конструкция OR REPLACE позволяет заменять процедуру с таким же именем. Это очень удобно в процессе отладки.
Аналогично создается хранимая функция:
CREATE [OR REPLACE] FUNCTION имя[(список_параметров)]
RETURN тип_результата, возвращаемого функцией
AS
блок PL/SQL, обязательно содержащий оператор
RETURN выражение
В списке параметров должен быть описан режим использования каждого параметра: IN (только входной – используется по умолчанию), OUT (только выходной), INOUT (и входной, и выходной). Режим использования указывается после имени параметра. Типы параметров, как и типы переменных, можно указывать явно или с помощью ссылки на соответствующий столбец или таблицу.
При описании локальных переменных подпрограммы разрешено опускать ключевое слово DECLARE.
Удалить процедуру или функцию можно при помощи команды DROP.