Cursor MySQL

Ejemplo de cómo se declara un cursor en MySQL

¿Qué es un cursor?

En el lenguaje SQL existen unos tipos de controles llamados cursores que son útiles para recorrer los registros que devuelve una consulta. Este tipo de estructuras sólo deben utilizarse cuando no haya otra forma de manipular conjuntos de datos en una sola instrucción.

Ejemplo de cursor en MySQL

Cada base de datos tiene su forma de declarar un cursor e incluso sus propios tipos de cursores (Oracle PL/SQL, Transact, etc). En este caso nos detendremos a ver cómo es la sintaxis para definir un cursor en MySQL.

DELIMITER ;;
DROP PROCEDURE IF EXISTS `micursor`;;
CREATE PROCEDURE `micursor`()
BEGIN

DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE uid integer;
DECLARE newdate integer;

DECLARE c1 cursor for SELECT id,timestamp from employers ORDER BY id ASC;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;

open c1;
c1_loop: LOOP
fetch c1 into uid,newdate;
IF `done` THEN LEAVE c1_loop; END IF;
UPDATE calendar SET timestamp = newdate WHERE id=uid;
END LOOP c1_loop;
CLOSE c1;
END ;;

Este cursor en concreto se podría realizar con una única consulta UPDATE, pero sirve para ver cómo se declara en la sintaxis de MySQL.

Como delimitador se ha usado el doble punto y coma (;;), se puede utilizar cualquier otro, pero deberás sustituirlo en todos los sitios.

Básicamente se declaran dos variables uid y newdate que contendrán el valor de cada campo de la fila. Luego se define el cursor mediante una consulta SQL (es como si se creara una tabla temporal). Finalmente, se recorre el cursor y se aplica la operación adecuada según nuestro programa.

¿Cómo ejecutar un cursor?

Para ejecutar el cursor podemos usar el método call:

call timechange();

Para guardar el cursor o llamarlo, se puede ejecutar desde el propio programa, utilizando phpMyAdmin, la consola de mysql o MySQL Query Browser por ejemplo.