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

1.9. Содержимое хранимой процедуры

При помощи запроса к таблице proc базы данных mysql можно получить отдельные параметры хранимой процедуры или функции. Однако это не всегда удобно, особенно если хранимую процедуру или функцию необходимо воспроизвести на другом сервере MySQL. Для того чтобы получить оператор create procedure или create function, необходимо воспользоваться операторами show create procedure и show create function соответственно. Операторы имеют следующий синтаксис:

SHOW CREATE PROCEDURE procname;

SHOW CREATE FUNCTION funcname;

Пример использования оператора show crate procedure приводится ниже.

1.10. Удаление хранимых процедур

Для удаления хранимых процедур и функций предназначены операторы drop procedure и drop function, которые имеют следующий синтаксис:

DROP PROCEDURE [IF EXISTS] nameproc;

DROP FUNCTION [IF EXISTS] namefunc;

Оператор drop procedure позволяет удалить хранимую процедуру nameproc. Если процедура с таким именем не существует, оператор возвращает ошибку, которую можно подавить, если использовать необязательное ключевое слово if exists.

Создадим хранимую процедуру test() и применим к ней оператор drop procedure (см. пример ниже).

Однако использование оператора drop procedure по отношению к хранимой функции заканчивается ошибкой.

Для удаления хранимых функций используем оператор drop function (см. пример ниже).

1.11. Редактирование хранимых процедур

Для изменения характеристик хранимой процедуры предназначен оператор alter procedure. Редактирование хранимой функции выполняется с помощью оператора alter function. Операторы имеют следующий синтаксис:

ALTER PROCEDURE sp_name [characteristic …]

ALTER FUNCTION sp_name [characteristic …]

Характеристика characteristic может принимать следующие значения:

  • sql security {DEFINER | INVOKER} – данное предложение определяет режим выполнения : хранимая процедура выполняется либо с правами создавшего ее пользователя (DEFINER), либо с правами пользователя, вызвавшего ее (INVOKER);

  • comment string – данное предложение позволяет назначить комментарий хранимой процедуре.

Замечание! Для выполнения операторов alter procedure и alter function необходимо обладать привилегией alter routine. Данная привилегия автоматически передается пользователю, создавшему хранимую процедуру.

Пример использования оператора alter procedure приведен ниже.

Как видно из примера, режим выполнения и комментарий к хранимой процедуре были успешно изменены.

1.12. Обработчик ошибок

Во время выполнения хранимых процедур и функций могут происходить самые разнообразные ошибки. При интерактивном выполнении запросов отследить возникновение ошибки и предпринять действия, направленные на их предотвращение, гораздо легче, чем при пакетном выполнении десятков запросов в хранимой процедуре. Поэтому СУБД MySQL поддерживает обработчик ошибок, которые позволяют каждой возникающей в хранимой процедуре ошибке назначить свой собственный обработчик. Кроме того, обработчик в зависимости от ситуации и серьезности ошибки может как прекратить, так и продолжить выполнение процедуры.

Для объявления такого обработчика предназначен оператор declare…handler for, который имеет следующий синтаксис:

DECLARE handler_type HANDLER FOR condition_value[, …] sp_statement

Тип обработчика handler_type может принимать одно из трех значений:

  • continue – выполнение текущей операции продолжается после выполнения оператора обработчика;

  • exit – выполнение составного оператора beginend, в котором объявлен обработчик, прекращается;

  • undo – данный вид обработчика пока не поддерживается.

Конструкция condition_value задает код ошибки, для которой будет происходить срабатывание обработчика. Обработчик может быть привязан сразу к нескольким ошибкам, для этого их коды следует перечислить через запятую. Конструкция condition_value может принимать одно из следующих значений:

  • sqlstate [value] sqlstate_value – значение sqlstate является пятисимвольным кодом в шестнадцатеричном формате и является стандартом в SQL. В СУБД MySQL данный код поддерживается, начиная с версии 4.1. Примерами таких кодов являются ‘HY000’, ‘42000’ и т. п. Следует отметить, что один код обозначает сразу несколько ошибок MySQL;

  • sqlwarning – любое предупреждение MySQL. Данное ключевое слово позволяет назначить обработчик для всех предупреждений MySQL. В терминах sqlstate обрабатываются любые события, для которых код sqlstate начинается с ‘01’;

  • not found – любая ошибка MySQL, связанная с отсутствием или невозможностью найти объект (таблицу, процедуру, функцию, столбец и т. п.). Данное ключевое слово позволяет назначить обработчик для всех ошибок такого рода. В терминах sqlstate обрабатываются любые события, для которых код sqlstate начинается с ‘02’;

  • mysql_error_code – обычные четырехзначные ошибки MySQL, такие как ‘1020’, ‘1232’, ‘1324’ и т. п.;

  • condition_name – имя условия, которое объявляется при помощи оператора declarecondition for, рассмотренного далее.

Выражение sp_statement содержит SQL-запрос, который выполняется при срабатывании обработчика.

Для демонстрации приемов работы с обработчиками ошибок создадим таблицу tbl (если она не была создана ранее), содержащую единственный столбец id, являющийся первичным ключом.

create table tbl (id int, primary key(id));

Так как поле id объявлено первичным ключом, его значения обязаны быть уникальными. Добавление в таблицу значений, совпадающих с одним из тех, которые уже существуют в таблице, приведет к возникновению ошибочной ситуации. Создадим хранимую процедуру handler_key(), которая содержит обработчик такой ситуации, и попытаемся добавить в таблицу tbl три одинаковых значения.

Как видно из вышеприведенного примера, в результате обработки ошибки не происходит остановка работы процедуры и последний запрос select version() успешно выполняется, несмотря на то, что предпринимаются две попытки присвоить первичному ключу неуникальное значение. В результате срабатывания обработчика, пользовательская переменная @error получает значение ‘Ошибка’.

В качестве обработчика ошибки можно использовать и составной оператор.

Как видно из приведенного выше примера, процедура выполняет все запросы, не прерываясь и лишь вызывая операторы из обработчика при возникновении каждой ошибки. Для того чтобы прекратить выполнение функции при возникновении ошибки, необходимо воспользоваться обработчиком declare exit (см. пример ниже).

Как видно из вышеприведенного примера, если используется обработчик exit, то при возникновении первой же ошибки функция прекращает свою работу.

При указании кода ошибки можно использовать не только их целочисленные значения, но и именованные условия, которые объявляются при помощи оператора declarecondition for, имеющего следующий синтаксис:

DECLARE condition_name CONDITION FOR condition_value

Оператор объявляет именованное условие condition_name для ошибки condition_value, которая может принимать одно из следующих значений:

  • sqlstate [value] sqlstate_value – значение sqlstate является пятисимвольным кодом в шестнадцатеричном формате и является стандартом в SQL. В СУБД MySQL данный код поддерживается, начиная с версии 4.1. Примерами таких кодов являются ‘HY000’, ‘HY001’, ‘42000’ и т. п. Следует отметить, что один код обозначает сразу несколько ошибок MySQL;

  • mysql_error_code – обычные четырехзначные ошибки MySQL, такие как ‘1020’, ‘1232’, ‘1324’ и т. п.;

Например, для обрабатываемой ранее ошибки 1062 (23000) – дублирование уникального индекса, оператор declarecondition for может выглядеть так, как это представлено ниже.

declare `violation` condition for sqlstate ‘23000’;

declare `violation` condition for 1062;

Первое объявление является более широким и охватывает все ошибки со статусом ‘23000’, второй вид ошибок более узкий и включает только дублирование уникального индекса.

Далее демонстрируется использование именованных условий, при этом следует обратить внимание, что название именованного условия заключается в необязательные обратные апострофы.

В данном примере хранимая процедура выполняет транзакцию. При возникновении ошибки дублирования записей состояние базы данных отказывается при помощи оператора rollback.