- •1. Хранимые процедуры и функции
- •1.1. Создание хранимой процедуры (функции)
- •1.2. Использование параметров
- •1.3. Локальные переменные
- •1.4. Присвоение значения локальной переменной
- •1.5. Форматирование временного интервала
- •1.6. Операторы ветвления
- •1.6.1. Оператор if…then…else
- •1.6.2. Оператор case
- •1.6.3. Проверка правильности ввода
- •1.6.4. Вывод приветствия в зависимости от времени суток
- •1.7. Циклы
- •1.7.1. Оператор while
- •1.7.2. Досрочный выход из цикла
- •1.7.3. Оператор repeat
- •1.7.4. Оператор loop
- •1.7.5. Отсутствующие идентификаторы
- •1.8. Получение списка созданных хранимых процедур и функций
- •1.9. Содержимое хранимой процедуры
- •1.10. Удаление хранимых процедур
- •1.11. Редактирование хранимых процедур
- •1.12. Обработчик ошибок
- •1.13. Курсоры
- •1.14. Рекурсивные хранимые процедуры
- •2. Триггеры
- •2.1. Создание триггера
- •2.2. Удаление триггера
- •2.3 Список созданных триггеров
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение
Высшего профессионального образования
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
Хранимые процедуры, функции, курсоры и триггеры
MySQL
Учебное пособие для вузов
Санкт-Петербург
2009
MySQL: Учебное пособие / СПбГУАП.СПб., 2009.
с.: ил.
В учебном пособии на практических примерах рассматриваются хранимые процедуры, функции, курсоры и триггеры MySQL.
Рецензенты:
Утверждено
Редакционно-издательским советом университета
В качестве учебного пособия
ГОУ ВПО «Санкт-Петербурский
государственный университет
аэрокосмического приборостроения», 2009
1. Хранимые процедуры и функции
1.1. Создание хранимой процедуры (функции)
Хранимые программы (процедуры и функции) поддерживаются в MySQL 5.0. Хранимые процедуры – набор SQL-выражений, который может быть сохранен на сервере. Как только это сделано, клиенту уже не нужно повторно передавать запрос, а требуется просто вызвать хранимую программу.
Создадим и заполним таблицу test для последующей работы с ней:
Далее напишем хранимую процедуру pr5:
mysql> delimiter //
mysql> create procedure pr5 (in t int)
-> begin
-> select count(id) from test where id > t;
-> end;
-> //
delimiter // - разделитель запросов; теперь для окончания ввода вместо ‘;’ необходимо будет использовать последовательность ‘//’. Это делается для того, чтобы символ ‘;’ не воспринимался как сигнал к отправке запроса на сервер.
create procedure – команда на создание хранимой процедуры;
begin – команда, означающая начало хранимой процедуры, после которой всегда следует тело этой процедуры;
end – команда, обозначающая завершение хранимой процедуры.
Здесь в скобках (in t int) также указано ключевое слово in. Таких слов всего три: in, out, inout, которые позволяют задать направление передачи данных.
in – данные передаются строго внутрь хранимой процедуры, но если параметру с данным модификатором внутри функции присваивается новое значение, по выходу из нее оно не сохраняется и параметр принимает значение, которое он имел до вызова процедуры;
out – данные передаются строго из хранимой процедуры, даже если параметр имеет какое-то начальное значение, внутри хранимой процедуры это значение не принимается в внимание. С другой стороны, если параметр изменяется внутри хранимой процедуры, после вызова процедуры параметр имеет значение, присвоенное ему внутри процедуры;
inout – параметр принимается во внимание как внутри процедуры, так и сохраняет свое значение после выхода из нее.
Замечание! Атрибуты in, out, inout доступны только для хранимой процедуры, в хранимой функции все параметры всегда имеют атрибут in.
Замечание! Список аргументов, заключенных в круглые скобки должен присутствовать всегда. Если аргументы отсутствуют, следует использовать пустой список аргументов
pr5( ).
Замечание! Определив разделитель delimiter, не обязательно прописывать его в последующих процедурах, если только вы не хотите сменить разделитель и вернуться, например, к ‘;’.
После имени параметра t указывается его тип (в данном примере int).
По умолчанию, если ни одни из модификаторов не указан, считается, что параметр (в данном примере t) объявлен с ключевым словом in.
Вызовем созданную нами хранимую процедуру, для чего воспользуемся командой call:
1.2. Использование параметров
Без параметров практически невозможно влиять на состояние процедур и функций во время вызова.
Как видно из данного примера, через параметр par хранимой процедуре proc1 передается числовое значение 123456, которое она присваивает пользовательской переменной @x.
Атрибут in сообщает СУБД MySQL, что при помощи параметра par пользователи предают данные внутрь функции. То есть если хранимая процедура будет изменена в соответствии с примером, приведенным ниже, новое значение параметра par, которое присваивается внутри функции, не будет доступно после вызова процедуры.
Замечание! Имена параметров при объявлении и вызове хранимой процедуры и при вызове необязательно должны совпадать. Внутри хранимой процедуры все локальные переменные используются без символа @, в то время как для глобальных пользовательских переменных символ @ перед именем обязателен.
Хранимая процедура proc1 принимает единственный in-параметр par, при помощи оператора set значение параметра изменяется внутри функции. Однако, как видно из приведенного выше примера, после выполнения хранимой процедуры значение пользовательской переменной @y, переданной функции в качестве параметра, не изменяется. Если требуется, чтобы значение переменной подвергалось изменению, необходимо объявить параметр процедуры с модификатором out.
Как видно из приведенного выше примера, при использовании модификатора out любые изменения параметра внутри процедуры отражаются на параметре. Передача в качестве значения пользовательской переменной позволяет использовать результат процедуры для дальнейших вычислений. Однако передать значение внутрь функции при помощи out-параметра уже не получится.
Для того чтобы через параметр можно было передать значение внутрь процедуры и получить значение, которое попадает в параметр в результате вычислений внутри процедуры, его следует объявить с атрибутом inout.
Теперь через параметр par можно как передавать значения внутрь процедуры, так и извлекать значения, которые получает параметр внутри процедуры. Тем не менее, рекомендуется использовать только in- и out-параметры, не прибегая к комбинированным inout-параметрам, т.к. это приводит к нечитабельному и непоследовательному коду.