- •Лекция 9. Хранимые процедуры и функции
- •Вопросы:
- •Определение хранимой процедуры
- •Хранимые процедуры и привилегии
- •Преимущества хранимых процедур
- •Создание хранимой процедуры
- •Параметры процедуры
- •Хранимые функции
- •Определение курсора
- •Курсоры
- •Курсоры
- •Возьмем в качестве примера использование хранимой процедуры для обновления таблицы info и будем
- •Еще один вариант использования через хранимую процедуру с использованием сразу двух курсоров:
- •Продолжение процедуры
- •Как использовать курсоры
- •Объявление курсоров
Курсоры
Курсоры должны быть объявлены до их использования. Переменные с условиями объявляются прежде курсоров. Обработчики объявляются строго после объявления курсоров.
Возьмем в качестве примера использование хранимой процедуры для обновления таблицы info и будем помечать записи на удаление по некоторому условию:
01.DELIMITER |
03.DROP PROCEDURE IF EXISTS test | 04.CREATE PROCEDURE test() 05.BEGIN
06.DECLARE DONE INT DEFAULT 0; 07.DECLARE PARAM_HASH_KEY BIGINT(20);
09.DECLARE CUR CURSOR FOR SELECT hash_key FROM tmp; 11.-- Когда он извлекается до конца, устанавливаем LINE 1
12.DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1; 14.OPEN CUR;
15.REPEAT
16.FETCH CUR INTO PARAM_HASH_KEY; 17.IF NOT DONE THEN
18.UPDATE info SET deleted=1, last_deleted_chk=NOW() WHERE deleted=0 AND hash_key=PARAM_HASH_KEY; 19.END IF;
20.UNTIL DONE END REPEAT; 21.CLOSE CUR;
22.END; 25.DELIMITER ;
Еще один вариант использования через хранимую процедуру с использованием сразу двух курсоров:
CREATE PROCEDURE curtest() 02.BEGIN
03.DECLARE done INT DEFAULT 0; 04.DECLARE a CHAR(16); 05.DECLARE b, c INT;
06.DECLARE cur1 CURSOR FOR SELECT id, data FROM test.t1; 07.DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
08.DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 10.OPEN cur1;
11.OPEN cur2; 13.REPEAT
14.FETCH cur1 INTO a, b; 15.FETCH cur2 INTO c; 16.IF NOT done THEN
Продолжение процедуры
17.IF b < c THEN
18.INSERT INTO test.t3 VALUES (a,b); 19.ELSE
20.INSERT INTO test.t3 VALUES (a,c); 21.END IF;
22.END IF;
23.UNTIL done END REPEAT; 25.CLOSE cur1;
26.CLOSE cur2; 27.END
Как использовать курсоры
Применение курсора в процедурах осуществляется путем
последовательного выполнения следующих шагов:
При помощи оператора DECLARE объявляется курсор для отдельного оператора SELECT или для отдельной процедуры.
Оператором OPEN производится открытие курсора. Используя оператор FETCH, осуществляется установление указателя на требуемую запись курсора. При этом значения полей текущей записи присваиваются переменным, указываемым в операторе FETCH. Обычно это конструкция помещается в итеративный элемент (проще говоря цикл), который прерывается по некоторому условию.
После того как курсор становится ненужным, он закрывается оператором CLOSE.
Объявление курсоров
DECLARE cursor_name CURSOR FOR select_statementЭто выражение объявляет курсор c именем cursor_name. select_statement указывает на конструкцию типа SELECT ...
FROM ... Можно объявить много курсоров в подпрограмме, но каждый курсор в данном блоке должен иметь уникальное имя. Выражение SELECT не должно содержать указание INTO.
Открывание курсоров
OPEN cursor_nameВыражение открывает ранее объявленный курсор
Выборка из курсора в переменную
FETCH cursor_name INTO var_name [, var_name] ...Это выражение выбирает следующую строку (если строка существует), используя указанный открытый курсор, и продвигает указатель курсора. Если более строк не доступно, происходит изменение значения переменной SQLSTATE в 02000. Для отлова этого события вы должны установить обработчик: HANDLER FOR SQLSTATE '02000'
Закрытие курсора
CLOSE cursor_nameЗакрывает курсор cursor_name. Если явно не указано, то курсор закрывается автоматически при закрытии соответствующего блока подпрограммы.
