Материал: Письменные лекции по дисциплине «Базы данных»

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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, это значит, что, пока транзакция не начата явно, каждый запрос автоматически выполняется в отдельной транзакции.