
- •1. Подготовка и допуск к работе
- •2. Содержание отчета
- •Лабораторная работа №15
- •Лабораторная работа № 16
- •Пример: backup table vines,query,client,distributor,delivery to c:/mysql_bak';
- •Удалены 3 таблицы. Теперь восстановим их.
- •Пример: optimizetablEmytable
- •Лабораторная работа №17
- •Значение usage можно задавать, если необходимо создать пользователя без привилегий.
- •Примеры:
- •Доступ к MySql из сети
- •С помощью утилиты Mysqlshow выполните команду на просмотр структуры и состав таблиц базы Mysql. Приведите в отчете её схему.
- •Лабораторная работа №18
- •Тема: Файлы журналов MySql Репликация в MySql
- •Цель: Формирование умений и знаний для работы в среде субд Mysql.
- •Журнал ошибок
- •Общий журнал запросов
- •Журнал обновлений (update)
- •Бинарный журнал обновлений
- •Журнал медленных запросов
- •Обслуживание файлов журналов
- •Репликация в MySql
- •Настройка репликации
- •Лабораторная работа № 19-20
- •Сохраненные процедуры и функции
- •Сохраненные подпрограммы и таблицы предоставления привилегий
- •Синтаксис хранимых процедур
- •Синтаксис alter procedure и alter function
- •Синтаксис drop procedure и drop function
- •Синтаксис команды call
- •Синтаксис составного оператора begin ... End
- •Синтаксис declare
- •Переменные в сохраненных подпрограммах Локальные переменные declare
- •Команда set
- •Команда select ... Into
- •Условия и драйверы
- •Declare условий
- •Declare драйвера
- •Курсоры
- •Объявление курсоров
- •Инструкция case
- •Инструкция loop
- •Инструкция leave
- •Инструкция iterate
- •5.2.10.6. Инструкция repeat
- •Инструкция while
- •Задание
- •Приложение а
- •Демонстрируется использование mysql в качестве несложного калькулятора:
- •Проверка таблицы при помощи команды describe:
- •Выборка всех данных
- •Выборка определенных строк. Выборка с условием
- •Операторы and и or можно использовать совместно.
- •Предположим, нужно узнать, в каком возрасте животные давали приплод:
- •В этом запросе мы указываем псевдонимы имен таблицы, для обращения к столбцам и определения, к какой из таблиц относится каждая ссылка на столбец.
- •Сортировку можно проводить по нескольким столбцам сразу.
- •Отсортировать результаты по возрасту также можно при помощи выражения orderby:
- •Максимальное значение столбца
Синтаксис 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;