SELECT * FROM Vzakladke.net

Статьи об автоматизации и программировании

Использование курсора в MySQL (MySQL cursor example)

 

 

Использование курсора в MySQL | Mysql cursor example

Как использовать курсоры

Использование курсора в функциях и процедурах реализуется при выполнении следующих шагов:

  • При помощи оператора DECLARE объявляется курсор для отдельного оператора SELECT или для отдельной процедуры.
  • Оператором OPEN производится открытие курсора.
  • Используя оператор FETCH, осуществляется установление указателя на требуемую запись курсора. При этом значения полей текущей записи присваиваются переменным, указываемым в операторе FETCH. Обычно это конструкция помещается в итеративный элемент (иначе сказать, цикл), который прерывается по некоторому условию.
  • В процессе перемещения указателя текущей записи курсора при выходе указателя за пределы курсора устанавливается значение SQLSTATE = 02000.
  • После того как курсор выполнил свое предназначение, его необходимо закрыть оператором CLOSE.

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

 

Возьмем в качестве примера использование хранимой процедуры для обновления таблицы info и будем помечать записи на удаление по некоторому условию:

DELIMITER |
 
DROP PROCEDURE IF EXISTS test |
CREATE PROCEDURE test()
BEGIN
   DECLARE DONE  INT DEFAULT 0;
   DECLARE PARAM_HASH_KEY  BIGINT(20);
 
   DECLARE CUR CURSOR FOR SELECT hash_key FROM tmp;
 
   -- Когда он извлекается до конца, устанавливаем LINE 1
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;
 
   OPEN CUR;
   REPEAT
      FETCH CUR INTO PARAM_HASH_KEY;
        IF NOT DONE THEN
         UPDATE info SET deleted=1, last_deleted_chk=NOW() WHERE deleted=0 AND hash_key=PARAM_HASH_KEY;
      END IF;
   UNTIL DONE END REPEAT;
   CLOSE CUR;
 END;
|
 
DELIMITER ;

 

Еще один вариант использования через хранимую процедуру с использованием сразу двух курсоров:

CREATE PROCEDURE curtest()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT id, data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;
  OPEN cur2;

REPEAT
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
       ELSE
          INSERT INTO test.t3 VALUES (a,c);
       END IF;
    END IF;
UNTIL done END REPEAT;

  CLOSE cur1;
  CLOSE cur2;
END

 

Также можно использовать функцию с курсором, в которую передается три параметра: lip - номер лаборатории, ti - номер пары и dt - дата проведения занятия:

CREATE DEFINER = 'mail'@'example.com' FUNCTION `get_plan`(lip INTEGER(11), ti INTEGER(11), dt DATE)
     RETURNS char(64) CHARSET latin1
     DETERMINISTIC
     CONTAINS SQL
     SQL SECURITY INVOKER
     COMMENT 'Функция возвращает список id из таблицы raspisanie'
 BEGIN
 
  DECLARE done INT DEFAULT 0;
  DECLARE a INT;
  DECLARE retv CHAR(64);
  DECLARE flg INT;
 
  DECLARE cur1 CURSOR FOR SELECT id FROM raspisanie  WHERE timeintv=ti AND rdate=dt AND labip=lip ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  OPEN cur1;
   SET retv:='';
   SET flg:=0;
   REPEAT
     FETCH cur1 INTO a;
       IF NOT done THEN     
         IF flg!=0 THEN
           SET retv:= CONCAT(retv,',' , a);
         ELSE
           SET retv:=a;
           SET flg:=1;     
         END IF;
       END IF;  
   UNTIL done  END REPEAT;
   CLOSE cur1;
   RETURN retv;
 END;

В текущей хранимой функции курсор предназначен для выборки данных (идентификаторов записей) в строку с разделителем в виде запятой по переданным параметрам.

 

Дата публикации: 2016-01-03 11:16:01

MySQL

0

Отзывы:

Ваше имя:

Ваш e-mail (необязательно):

Сообщение:

Captcha