Студенту >> Базы данных (MySQL)


Хранимые процедуры MySQL(Часть 2)

SQL операторы уникальные для хранимых процедур

При написании процедуры может возникнуть необходимость использования условий или циклов, стандартный SQL язык не предназначен для этих целей. Для этих целей, SQL стандарт включается в себя набор операторов которые можно использовать лишь внутри хранимых процедур.

Условие: IF THEN ELSE
IF условие 
THEN выражение; 
ELSE выражение;
END IF

Логика проста. Если условие истинно, тогда выполняется набор условий, иначе другие условия.

Пример:
mysql> delimiter |
mysql> create procedure aorb(a int, b int)
    -> begin
    -> if (a>b) then select "A больше, чем B" as "Результат";
    -> else select "B больше, чем A" as "Результат";
    -> END IF;
    -> END|
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter;
Условие: CASE
CASE переменная 
WHEN условие выражение; 
WHEN условие выражение;
ELSE выражение;
END CASE

Вместо длинных вложенных операторов IF, использование оператора CASE позволяет код хранимой процедуры сделать более компактным и проще читаемым.

Пример:
delimiter |
CREATE PROCEDURE test_case(a int) 
BEGIN 
 CASE a
  WHEN 1 THEN SELECT "Один"; 
  WHEN 2 THEN SELECT "Два"; 
  WHEN 3 THEN SELECT "Три";
  ELSE SELECT 'Нечто другое'; 
 END CASE; 
END|
delimiter ;
Циклы: WHILE

Циклы это живой компонент процедуры – они позволяют определенному участку кода повторяться некоторое количество раз. WHILE циклы, первый тип циклов. Цикл повторяет блок операторов до тех пор, пока условие истинно.

WHILE условие DO
Выражение;
END WHILE
Пример:
mysql> CREATE PROCEDURE test_while(IN a INT)
BEGIN 
 WHILE (a < 20) DO 
  SELECT a; 
  SET a=a + 1; 
 END WHILE;
END|
Циклы: REPEAT
REPEAT 
выражение;
UNTIL условие
END REPEAT

Выражение повторяется до тех пор пока условие Until ложно, различие с циклом While в том, что этот цикл выполняется хотя бы один раз.

mysql> CREATE PROCEDURE test_repeat(IN a INT)
    -> BEGIN
    ->  REPEAT
    ->   SELECT a;
    ->   SET a = a + 1;
    ->   UNTIL a > 5
    ->  END REPEAT;
    -> END|
Query OK, 0 rows affected (0.00 sec)
НАВЕРХ