Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4-1 Системи управління базами даних / Лекции / ЛК - 09 СУБД Хранимые процедуры.pptx
Скачиваний:
162
Добавлен:
02.02.2021
Размер:
84.32 Кб
Скачать

Курсоры

Курсоры должны быть объявлены до их использования. Переменные с условиями объявляются прежде курсоров. Обработчики объявляются строго после объявления курсоров.

Возьмем в качестве примера использование хранимой процедуры для обновления таблицы 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. Если явно не указано, то курсор закрывается автоматически при закрытии соответствующего блока подпрограммы.