Курсоры MYSQL

MySQL поддерживает работу с курсорами в рамках хранимых программ, \соответствует синтаксису встроенных SQL запросов, и обладают следующими свойствами:

  • "нечувствительность" ("не точный"): сервер может как создавать копию файлов результирующей таблицы- так и не создавать.
  • только чтение: не может быть обновлён
  • последовательность - может быть пройдён только в одном направлении - пропускать строки нельзя.

Объявление курсора должно происходить до объявления его обработчика(HANDLER) , но после объявлений переменных и "условий"

Пример:

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  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 NOT FOUND SET done = TRUE;/* обработчик объявляется после объявления курсора*/

  OPEN cur1;// курсоры - получаем доступ к данным, загруженным в результате выполнения запроса курсора.
  OPEN cur2;

  read_loop: LOOP // цикл
    FETCH cur1 INTO a, b; // получаем данные последовательно   ,построчно
    FETCH cur2 INTO c;
    IF done THEN  // условие для выхода из цикла
      LEAVE read_loop;
    END IF;
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END LOOP; // конец цикла

  CLOSE cur1; // закрываем курсоры
  CLOSE cur2;
END;

http://dev.mysql.com/doc/refman/5.1/en/c...