Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для студентов РУБД / Лаб раб 4 курс.doc
Скачиваний:
60
Добавлен:
21.03.2016
Размер:
635.39 Кб
Скачать

Синтаксис declare

Инструкция DECLAREиспользуется, чтобы определить различные элементы, локальные для подпрограммы:

  • Локальные переменные.

  • Условия и драйверы.

  • Курсоры. Подробности в разделе

  • Инструкции SIGNALиRESIGNALв настоящее время не обеспечиваются.

DECLAREпозволяется только внутриBEGIN ... ENDи должен быть в начале, перед любыми другими инструкциями.

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

Переменные в сохраненных подпрограммах Локальные переменные declare

DECLARE var_name[,...] type

[DEFAULT value]

Эта инструкция используется, чтобы объявить локальные переменные. Чтобы обеспечивать значение по умолчанию для переменной, включите предложение DEFAULT. Значение может быть определено как выражение, оно не обязательно должно быть константой. Если предложениеDEFAULTотсутствует, начальное значениеNULL.

Область (контекст) локальной переменной: внутри блока BEGIN ... END, где это объявлено. Переменная может упоминаться в блоках, вложенных внутри блока объявления, за исключением тех блоков, которые объявляют переменную с тем же самым именем.

Команда set

SET var_name = expr

[, var_name = expr] ...

Инструкция SETв сохраненных подпрограммах представляет собой расширенную версию общей инструкцииSET. Вызванные переменные могут быть объявлены внутри подпрограммы или глобальными переменными системы.

Команда 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.

Условия и драйверы

Некоторые условия могут требовать специфической обработки. Эти условия могут касаться ошибок или общего управления потоком данных внутри подпрограммы.

Declare условий

DECLARE condition_name CONDITION FOR

condition_value

condition_value:

SQLSTATE [VALUE] sqlstate_value

| mysql_error_code

Эта инструкция определяет условия, которые нуждаются в специфической обработке. Это сопоставляет имя с определенным условием ошибки. Имя может впоследствии использоваться в инструкции DECLARE HANDLER.

Здесь condition_valueможет быть значением SQLSTATE или же кодом ошибки MySQL.

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может быть любым из следующих значений:

  • Значение SQLSTATE или MySQL-код ошибки.

  • Имя условия, предварительно определенное с DECLARE ... CONDITION.

  • SQLWARNING(краткая запись для всех кодов SQLSTATE, которые начинаются с01).

  • NOT FOUND(краткая запись для всех кодов SQLSTATE, которые начинаются с02).

  • SQLEXCEPTION(краткая запись для всех кодов SQLSTATE, не охваченныхSQLWARNINGилиNOT FOUND).

Пример:

mysql> CREATE TABLE test.t (s1 int,primary key (s1));

Query OK, 0 rows affected (0.00 sec)

mysql> delimiter //

mysql> CREATE PROCEDURE handlerdemo ()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;

-> SET @x = 1;

-> INSERT INTO test.t VALUES (1);

-> SET @x = 2;

-> INSERT INTO test.t VALUES (1);

-> SET @x = 3;

-> END;

-> //

Query OK, 0 rows affected (0.00 sec)

mysql> CALL handlerdemo()//

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x//

+------+

| @x |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

Пример сопоставляет драйвер с SQLSTATE 23000, который происходит для ошибки дублирования ключа. Обратите внимание, что @xравен3, это показывает что MySQL перейдет к концу процедуры. Если строкаDECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;не была представлена, MySQL примет заданный по умолчанию путь (EXIT) после второй неудачиINSERTиз-за ограниченияPRIMARY KEY, аSELECT @xвозвратит2.

Если Вы хотите игнорировать условие, Вы можете объявлять драйвер CONTINUEдля этого и сопоставлять его с пустым блоком. Например:

DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;