¿Qué es un cursor en mysql? • Un cursor es un objeto que apunta a las filas retornadas de una consulta. Esta característica permite manipular los datos de cada fila de forma individual. MySQL usa la palabra reservada CURSOR para declarar estos espacios de lectura. ¿Como Usar Cursores En MySQL? Para implementar un cursor debemos tener en cuenta 4 fases de su funcionamiento: • Declaración: DECLARE nombre_cursor CURSOR FOR ; • Apertura: OPEN nombre_cursor; • Lectura: FETCH nombre_cursor INTO variable1,variable2,... • Cierre CLOSE nombre_cursor; FETCH • FETCH, ésta se encarga de moverse entre los registros hasta que no encuentre más.
FETCH permite asignar a determinadas variables, el valor de los
campos del registro donde se encuentre el cursor en ese preciso momento y así poder trabajar con esos valores. Sintaxis de FetCh • FETCH cursor1 INTO a, b; • Ejemplo: Se está especificando que almacene temporalmente el resultado de los dos campos consultados, en las variables a y b previamente declaradas. -- ... resto del codigo, el que hacer con esas dos CREATE PROCEDURE ejemplo() variables (a y b) BEGIN -- abrimos el procedure -- cerramos el cursor -- se declaran las variables a usar CLOSE cursor1; DECLARE a INT; DECLARE b CHAR(6); -- cerramos el procedure -- se declara un cursor que navegara por el END// resultado de la consulta DECLARE cursor1 CURSOR FOR SELECT id,nombre FROM usuarios; OPEN cursor1; -- se abre el cursor -- ... parte del procedimiento REPEAT -- comenzamos las iteraciones para movernos entre los registros -- almacenamos el id y el nombre del registro actual, en las variables a y b FETCH cursor1 INTO a, b; UNTIL expresion END REPEAT;-- salimos del ciclo Los Handlers (manejadores) • Cuando se produce un error en MySQL el servidor devuelve la descripción y dos códigos diferentes para el error: 1.- MySQL error: un código de error (numérico) que es exclusivo de ese manejador de base de datos. 2.- SQLSTATE: una cadena de cinco caracteres que está estandarizada, es decir, es independiente del manejador de base de datos, si estamos trabajando con Oracle, SQL Server, etc. obtendremos el mismo valor para determinado error. No todos los códigos de error MySQL tienen su equivalente en código SQLSTATE. Cada error de Mysql está relacionado con un código de error SQLState, pero no siempre esta relación es uno a uno. HY000 es un código de error SQLSTATE para propositos generales que devuelve MySQL cuando su código de error no tiene asociado un código SQLSTATE. Los handlers se declaran luego de las variables y los cursores, su sintaxis es la siguiente: • Sintaxis: • DECLARE tipo_de_handler HANDLER FOR condicion_del_handler • Donde tipo_de_handler (que hacer en caso de que la condición se cumpla) puede ser: - CONTINUE: indica que la ejecución de la rutina debe seguir. - EXIT: indica que la ejecución de la rutina debe culminar. • En condicion_del_handler podemos usar alguno de los siguientes valores: - SQLSTATE: códigos de errores independiente de la plataforma. - MySQL error: códigos de errores exclusivos de MySQL. - SQLWARNING: abreviación para los códigos SQLSTATE que comienzan con 01. - NOT FOUND: abreviación para los códigos SQLSTATE que comienzan con 02. - SQLEXCEPTION: abreviación para el resto de códigos SQLSTATE. - nombre de una condición declarada previamente. • Por ejemplo: - la función FETCH se encarga de moverse entre los registros hasta que no encuentre más y en ese caso se produce la condición SQLSTATE 02000. DROP PROCEDURE IF EXISTS ejemplo// -- asignamos el nombre actual a la variable actual CREATE PROCEDURE ejemplo() FETCH cursor1 INTO a; BEGIN -- declaramos las variables antes de los cursores -- mientras no lleguemos el final de los registros, continuamos DECLARE bContinuar BOOLEAN DEFAULT true; IF bContinuar THEN -- true por defecto DECLARE a CHAR(20); -- aqui lo que tengas que hacer .. -- declaramos un cursor con su respectiva consulta DECLARE cursor1 CURSOR FOR SELECT nombre FROM usuarios; END IF; -- declaramos un manejador, -- bContinuar sera false cuando se produzca la condicion UNTIL NOT bContinuar END REPEAT;-- salimos del ciclo SQLSTATE 02000, DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET bContinuar = false; CLOSE cursor1; -- cerramos el cursor END//