- •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 Список созданных триггеров
1.7.3. Оператор repeat
Оператор repeat, так же как и оператор while, реализует цикл:
[label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [label]
Отличительной особенностью данного цикла является тот факт, что условие цикла search_condition проверяется не в начале, как в цикле while, а в конце оператора (ключевое слово until). Таким образом, цикл выполняет, по крайней мере, одну операцию независимо от условия. Следует отметить, что цикл repeat выполняется, пока условие search_condition ложно.
Оператор repeat может быть снабжен необязательной меткой label, по которой легко осуществлять досрочный выход из цикла при помощи операторов leave и iterate, рассмотренных в предыдущем разделе.
В следующем примере представлена процедура binrand(), которая генерирует и выводит случайную бинарную последовательность из 20 символов. Для формирования бинарной последовательности применяется цикл repeat.
1.7.4. Оператор loop
Оператор loop предназначен для реализации циклов и имеет следующий синтаксис:
[label:] LOOP
statement_list
END LOOP [label]
Цикл loop, в отличие от операторов while и repeat, не имеет условий выхода. Поэтому данный вид цикла должен обязательно иметь в своем составе оператор leave.
Хранимую процедуру binrand(), приведенную в примере выше, можно переписать с использованием цикла loop (см. пример ниже).
1.7.5. Отсутствующие идентификаторы
Таблица tbl имеет первичный ключ id, снабженный атрибутом auto_increment. По мере работы с таблицей некоторый записи удаляются таким образом, что образуются пропуски (см. пример ниже).
Пусть стоит задача создать список отсутствующих идентификаторов. Решить эту задачу можно при помощи хранимой процедуры, представленной в примере ниже.
1.8. Получение списка созданных хранимых процедур и функций
Просмотреть список уже созданных хранимых процедур можно при помощи оператора show procedure status, который имеет следующий синтаксис:
SHOW PROCEDURE STATUS [LIKE ‘pattern’];
Оператор возвращает список хранимых процедур, который содержит перечень хранимых функций. При использовании ключевого слова like можно вывести информацию только о тех процедурах, имена которых удовлетворяют шаблону pattern.
Как видно из приведенного выше примера, оператор возвращает результирующую таблицу, в которой каждая строка соответствует одной хранимой процедуре. При этом таблица содержит 8 столбцов:
Db – имя базы данных, в которой сохранена процедура;
Name – имя процедуры;
Type – тип хранимой процедуры, принимает значение procedure для оператора хранимой процедуры и function для хранимой функции (список хранимых функций возвращается оператором show procedure status, который рассматривается далее);
Definer – учетная запись, от имени которой была создана хранимая процедура;
Modified – дата последней модификации хранимой процедуры;
Created – дата создания хранимой процедуры;
Security_type – режим выполнения хранимой процедуры. Если это поле принимает значение definer, то хранимая процедура выполняется с правами доступа пользователя, создавшего данную процедуру. Если поле Security_type принимает значение invoker, то хранимая процедура выполняется с правами доступа пользователя, вызывающего процедуру при помощи оператора call;
Comment – комментарий к хранимой процедуре.
Для просмотра списка хранимых функций предназначен оператор show function status. Оператор имеет следующий синтаксис:
SHOW FUNCTION STATUS [LIKE ‘pattern’];
Оператор выводит список хранимых функций, который не включает в свой состав хранимые процедуры (см. пример ниже). При использовании ключевого слова like можно вывести информацию только о тех функциях, имена которых удовлетворяют шаблону pattern.
Формат вывода оператора show function status совпадает с форматом оператора show procedure status, рассмотренного ранее.
Помимо представленных выше операторов show, существует еще одни способ извлечь информацию о хранимых процедурах – извлечь строки таблицы proc системной базы данных mysql, куда помещаются все хранимые процедуры. В примере ниже приводится select-запрос, извлекающий запись, соответствующую хранимой функции FormatSecond().
Как видно из примера, результирующая таблица имеет 16 полей:
db – имя базы данных, в которую сохранена процедура;
name – имя процедуры;
type – тип хранимой процедуры, может принимать два значения: procedure или function, для хранимой процедуры или функции соответственно;
specific_name – имя процедуры;
language – язык, на котором написана хранимая процедура, в настоящий момент принимает единственное значение – SQL;
sql_data_access – поле показывает, насколько зависит хранимая процедура от данных, и может принимать следующие значения: contains_sql, no_sql, reads_sql_data, modifies_sql_data, если процедура, соответственно использует константы, не использует SQL, читает данные или модифицирует их;
is_deterministic – данное поле определяет, является ли хранимая процедура детерминированной (YES) или нет (NO). На состояние данного поля оказывает влияние характеристика deterministic;
security_type – режим выполнения хранимой процедуры. Если это поле принимает значение DEFINER, то хранимая процедура выполняется с правами доступа создавшего ее пользователя. Если поле security_type принимает значение INVOKER, то хранимая процедура выполняется с правами доступа пользователя, вызывающего процедуру при помощи оператора call;
param_list – список параметров хранимой процедуры;
returns – тип результата, возвращаемого хранимой функцией, для хранимых процедур поле принимает пустую строку;
body – тело хранимой процедуры от оператора begin до оператора end;
definer – учетная запись, из-под которой была создана хранимая процедура;
created – дата и время создания хранимой процедуры;
modified – дата и время последней модификации хранимой процедуры;
sql_model – режимы выполнения хранимой процедуры;
comment – комментарий к хранимой процедуре.
Удобство данного подхода заключается в том, что при форматировании отчета можно использовать всю гибкость, предоставляемую оператором select, и извлекать только ту информацию, которая действительно необходима. В примере ниже формируется список всех хранимых процедур и функций, причем выводится только название и признак – процедура или функция.