Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Хранимые процедуры и функции.doc
Скачиваний:
6
Добавлен:
24.09.2019
Размер:
22.57 Mб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

Государственное образовательное учреждение

Высшего профессионального образования

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ

Хранимые процедуры, функции, курсоры и триггеры

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-параметрам, т.к. это приводит к нечитабельному и непоследовательному коду.