Está en la página 1de 11

Cursores en mysql

MSc. Ing. Arturo Diaz Pulido.


¿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//

OPEN cursor1;-- se abre el cursor declarado


REPEAT -- comenzamos las iteraciones

También podría gustarte