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

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, и извлекать только ту информацию, которая действительно необходима. В примере ниже формируется список всех хранимых процедур и функций, причем выводится только название и признак – процедура или функция.