1 row in set (0.00 sec)
mysql> CALL my_proc_INOUT(@C,'F')$$
Query OK, 1 row affected (0.00 sec) mysql> SELECT @C$$
+------+
| @C |
+------+
| |
1 | |
+------+
1 row in set (0.00 sec)
3.4. Операторы IF и CASE
Оператор IF реализует базовую конструкцию условия, он должен заканчиваться точкой с запятой. Существует также функция IF(), которая отличается от оператора IF. Вот синтаксис оператора IF:
IF условие THEN оператор(ы)
[ELSEIF условие THEN оператор(ы)] ...
[ELSE оператор(ы)]
END IF
Если условие выполняется, выполняются операторы соответствующих блоков THEN или ELSE IF.
Если условие не удовлетворяется, выполняются операторы блока ELSE. Каждый оператор состоит из одного или нескольких операторов SQL; пустые операторы не допускается.
Оператор CASE используется для создания внутри хранимой процедуры MySQL сложной условной конструкции. Оператор CASE не может содержать блок ELSE NULL и должен закрываться END CASE, а не
END. Синтаксис:
CASE значение
WHEN значение THEN список_операторов
[WHEN значение THEN список_операторов] ...
[ELSE список_операторов] END CASE
или:
CASE
WHEN условие_поиска THEN список_операторов
[WHEN условие_поиска THEN список_операторов] ...
[ELSE список_операторов] END CASE
Пояснение: первый синтаксис.
Значение — это выражение, которое сравнивается со значением в каждом блоке WHEN, пока они не будут равны. При найденном соответствии значений выполняется
соответствующего блока THEN.
Если значения не равны, тогда выполняется блока ELSE, если таковой имеется.
Пояснение: второй синтаксис.
Каждое выражение блока условие_поиска оценивается, пока одно из них не будет истинно. В этот момент выполняется список_операторов соответствующего блока THEN.
Если ни одно из выражений условие_поиска не истинно, тогда выполняется список_операторов блока ELSE, если таковой имеется. Каждый список_операторов состоит из одного или нескольких операторов SQL; пустой список_операторов не допускается.
Пример использования CASE.
DELIMITER $$
CREATE PROCEDURE `hr`.`my_proc_CASE` (INOUT no_employees INT, IN salary INT) BEGIN
CASE
WHEN (salary>10000)
THEN (SELECT COUNT(job_id) INTO no_employees
FROM jobs
WHERE min_salary>10000);
WHEN (salary<10000)
THEN (SELECT COUNT(job_id) INTO no_employees
FROM jobs
WHERE min_salary<10000);
ELSE (SELECT COUNT(job_id) INTO no_employees
FROM jobs WHERE min_salary=10000);
END CASE;
END$$
В приведенной выше процедуре мы передаем переменную salary через параметр IN. Есть оператор CASE с двумя блоками WHEN и ELSE, который проверяет условия и возвращает значение счетчика в no_employees. no_employees — число сотрудников, в процедуру подается изначально пустое.
Выполним процедуру через командную строку MySQL.
Подсчитаем количество сотрудников, удовлетворяющих следующим условиям:
●MIN_SALARY > 10000
●MIN_SALARY < 10000
●MIN_SALARY = 10000
Количество сотрудников, чья зарплата превышает 10000:
mysql> CALL my_proc_CASE(@C,10001);
Query OK, 1 row affected (0.00 sec) mysql> SELECT @C;
+------+
| @C |
+------+
| |
2 | |
+------+
1 row in set (0.00 sec)
Количество сотрудников, чья зарплата меньше, чем 10000:
mysql> CALL my_proc_CASE(@C,9999);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @C; +------+
| @C | +------+ | 16 | +------+
1 row in set (0.00 sec)
Количество сотрудников, чья зарплата равна 10000:
mysql> CALL my_proc_CASE(@C,10000);
Query OK, 1 row affected (0.00 sec) mysql> SELECT @C;
+------+
| @C |
+------+
| |
1 | |
+------+
1 row in set (0.00 sec)
3.5. Оператор RETURN
Оператор RETURN завершает выполнение хранимой функции MySQL и возвращает агенту, вызвавшему функцию, значение expr. В хранимой функции должен содержаться, по крайней мере, один оператор RETURN.
Если функция имеет несколько точек выхода, она может содержать больше одного RETURN. Синтаксис следующий:
RETURN expr
Лекция 4. Транзакции. Уровни изоляции. Блокировки.
●Понятие транзакции;
●Операторы транзакции;
●Уровни изоляции (изолированности) транзакций;
●Тест ACID;
●Механизм блокировок;
●Взаимоблокировки;
●Ведение журнала транзакций.
4.1. Понятие транзакции
Транзакция — это операция, состоящая из одного или нескольких запросов к базе данных. Суть транзакций — обеспечить корректное выполнение всех запросов в рамках одной транзакции, а также обеспечить механизм изоляции транзакций друг от друга для решения проблемы совместного доступа к данным.
Любая транзакция либо выполняется полностью, либо не выполняется вообще.
В транзакционной модели есть два фундаментальных понятия: COMMIT и ROLLBACK. COMMIT означает фиксацию всех изменений в транзакции. ROLLBACK означает отмену (откат) изменений, произошедших в транзакции.
При старте транзакции все последующие изменения сохраняются во временном хранилище. В случае выполнения COMMIT, все изменения, выполненные в рамках одной транзакции, сохраняются в физическую БД. В случае выполнения ROLLBACK произойдет откат и все изменения, выполненные в рамках этой транзакции, не сохранятся.
В MySQL транзакции поддерживаются только таблицами InnoDB. Таблицы MyISAM транзакции не поддерживают. В InnoDB по умолчанию включен AUTOCOMMIT, это значит, что, пока транзакция не начата явно, каждый запрос автоматически выполняется в отдельной транзакции.