MySQL: руководство профессионала
Шрифт:
Факультативное предложение [NOT] ATOMIC еще не обеспечивается. Это означает, что никакие точки сохранения транзакций не установлены в начале блока команды, и предложение BEGIN, используемое в этом контексте не имеет никакого эффекта на текущей (актуальной) транзакции.
5.2.6. Синтаксис DECLARE
Инструкция DECLARE используется, чтобы определить различные элементы, локальные для подпрограммы:
Локальные переменные. Подробности в разделе "5.2.7. Переменные в
Условия и драйверы. Подробности в разделе "5.2.8. Условия и драйверы ".
Курсоры. Подробности в разделе "5.2.9. Курсоры".
Инструкции SIGNAL и RESIGNAL в настоящее время не обеспечиваются.
DECLARE позволяется только внутри BEGIN … END и должен быть в начале, перед любыми другими инструкциями.
Объявления должны следовать за некоторым порядком. Курсоры должны быть объявлены перед объявлением драйверов и переменных, условия должны быть объявлены перед объявлениями, курсорами или драйверами.
5.2.7. Переменные в сохраненных подпрограммах
Вы можете объявлять и использовать переменные внутри подпрограммы.
5.2.7.1. Локальные переменные DECLARE
DECLARE var_name[,…] type [DEFAULT value]
Эта инструкция используется, чтобы объявить локальные переменные. Чтобы обеспечивать значение по умолчанию для переменной, включите предложение DEFAULT. Значение может быть определено как выражение, оно не обязательно должно быть константой. Если предложение DEFAULT отсутствует, начальное значение NULL.
Локальные переменные обрабатываются подобно стандартным параметрам относительно типа данных и проверки переполнения.
Область (контекст) локальной переменной: внутри блока BEGIN … END, где это объявлено. Переменная может упоминаться в блоках, вложенных внутри блока объявления, за исключением тех блоков, которые объявляют переменную с тем же самым именем.
5.2.7.2. Команда SET
SET var_name = expr [, var_name = expr] …
Инструкция SET в сохраненных подпрограммах представляет собой расширенную версию общей инструкции SET. Вызванные переменные могут быть объявлены внутри подпрограммы или глобальными переменными системы.
Инструкция SET в сохраненных подпрограммах выполнена как часть синтаксиса SET. Это позволяет расширенный синтаксис SET a=x, b=y, …, где различные виды переменных (локально объявленные, глобальные и переменные сеанса сервера могут быть смешаны. Это также позволяет комбинации локальных переменных и некоторых параметров, которые имеют смысл только для переменных системы. В этом случае, параметры распознаны, но игнорируются.
5.2.7.3. Команда SELECT … INTO
SELECT col_name[,…] INTO var_name[,…] table_expr
Этот синтаксис SELECT сохраняет выбранные столбцы непосредственно в переменные. Следовательно, только одиночная строка может быть получена.
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
Имена переменных пользователя не чувствительны к регистру. Важно: имена переменных SQL не должны совпадать с именами столбцов. Если инструкция SQL, типа SELECT … INTO, содержит ссылку к столбцу, и есть объявленная локальная переменная с тем же самым именем, MySQL в настоящее время интерпретирует ссылку как имя переменной. Например, в следующей инструкции xname интерпретируется как ссылка к переменной, а не к столбцу с именем xname:
CREATE PROCEDURE sp1 (x VARCHAR(5))
BEGIN
DECLARE xname VARCHAR(5) DEFAULT 'bob';
DECLARE newname VARCHAR(5);
DECLARE xid INT;
SELECT xname, id INTO newname, xid FROM table1 WHERE xname = xname;
SELECT newname;
END;
Когда эта процедура вызвана, переменная newname возвращает значение 'bob' независимо от значения столбца table1.xname.
5.2.8. Условия и драйверы
Некоторые условия могут требовать специфической обработки. Эти условия могут касаться ошибок или общего управления потоком данных внутри подпрограммы.
5.2.8.1. DECLARE условий
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
Эта инструкция определяет условия, которые нуждаются в специфической обработке. Это сопоставляет имя с определенным условием ошибки. Имя может впоследствии использоваться в инструкции DECLARE HANDLER.
Здесь condition_value может быть значением SQLSTATE или же кодом ошибки MySQL.
5.2.8.2. DECLARE драйвера
DECLARE handler_type HANDLER FOR condition_value[,…] statement
handler_type:
CONTINUE | EXIT | UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
| mysql_error_code
Инструкция DECLARE … HANDLER определяет драйверы, с каждым из которых может иметь дело одно или большее количество условий. Если одно из этих условий происходит, определенная инструкция statement будет выполнена. Инструкция может быть простой инструкцией (например, SET var_name = value), или это может быть составной инструкцией, записанной с помощью парочки BEGIN и END.
Для драйвера CONTINUE выполнение текущей подпрограммы продолжается после выполнения инструкции драйвера. Для драйвера EXIT выполнение завершается для составной инструкции BEGIN … END, в которой драйвер объявлен. Это истинно, даже если условие происходит во внутреннем блоке. Инструкция типа драйвера UNDO еще не обеспечивается (пока?).
Если происходит условие, для которого никакой драйвер не был объявлен, заданное по умолчанию действие: EXIT.
Параметр condition_value может быть любым из следующих значений: