Hermosa Programación - Cursores en MySQL
Hermosa Programación - Cursores en MySQL
Hermosa Programación - Cursores en MySQL
1 de 5
http://hermosaprogramacion.blogspot.com/2014/06/mysql-cursores.html
SQL
Cursores en MySQL
Un cursor es un objeto que apunta a las
filas retornadas de una consulta. Esta
caracterstica permite manipular los datos
de cada fila de forma individual. MySQL
usa la palabra reservada CURSOR para
declarar estos espacios de lectura.
1. Declaracin
2. Apertura
3. Lectura
4. Cierre
1. DECLARACION
Al igual que una una variable, los cursores se declaran con la sentencia DECLARE. Debemos declararlos despus
de nuestras variables corrientes, de lo contrario MySQL, generar un error. Veamos la sintaxis:
DECLARE nombre_cursor CURSOR FOR <consulta>;
No significa que el objeto cursor_edad vaya a guardar los datos de la consulta a la cual esta referenciando. Lo que
hace es apuntar a la direccin de memoria del primer resultado de dicha consulta. Si tienes conocimientos en C++
se te har mas fcil comprender esta interpretacin.
2. APERTURA
En la fase de declaracin la consulta a la que hace referencia el cursor, aun no se ha ejecutado. Para ejecutarla
usaremos el comando OPEN. Sin esta apertura los resultados del cursor no pueden ser ledos por MySQL, por lo
tanto se producir un error.
2 de 5
http://hermosaprogramacion.blogspot.com/2014/06/mysql-cursores.html
Debes tener en cuenta que al abrir el cursor este sita un puntero a la primera fila arrojada por la consulta.
OPEN nombre_cursor;
3. LECTURA
La lectura de los resultados de un cursor se hace con el comando FETCH. Este nos permite acceder a la primer fila
generada por la consulta. Si se vuelve a usar el cursor pasa a apuntar a la segunda fila, luego a la tercer y as
sucesivamente hasta que el cursor no tenga resultados que referenciar.
FETCH nombre_cursor INTO variable1,variable2,...
Es importante tener variables declaradas para almacenar temporalmente los datos de las columnas de cada fila,
generadas por la consulta. Estas variables lgicamente deben tener el mismo tipo de dato que el valor de la
columna a almacenar, y luego relacionarlas con la sentencia INTO.
Por ejemplo, si quisiramos almacenar el id, nombre y apellido del primer empleado de la tabla EMPLEADO,
hacemos lo siguiente:
Me imagino que intuyes que si queremos recorrer todas las filas de la consulta, necesitaremos de alguna estructura
repetitiva, no es cierto?, claro!, incluir el comando FETCH dentro de un bucle permite leer todos los resultados de
un cursor. Cuando el cursor llegue al final de los resultados de la consulta, entonces el bucle termina. Pero terminar
un bucle de este tipo necesita una condicin de parada especial en MySQL.
Existen manejadores de errores en MySQL para esta tarea, aunque por el momento no los hemos estudiado es
necesario saber lo siguiente:
Cuando usamos FETCH en el cursor, pero ya no hay mas filas por retornar, MySQL arroja un error llamado '02000
NO DATA FECH' . As que lo que debemos hacer es crear un manejador para indicar que cuando suceda ese error,
el programa no termine, pero que si termine el bucle. Veamos:
Aqu indicamos que si ocurre un error tipo NOT FOUND, entonces asignemos a la variable @hecho el valor de
TRUE. Con esa variable podremos manejar la terminacin de nuestro bucle mas adelante.
4. CIERRE
Una vez ledo todos los resultados del cursor, procedemos a cerrar y limpiar espacios de memoria con CLOSE.
CLOSE nombre_cursor;
Cree un procedimiento en MySQL que imprima el cdigo y el total acumulado de ventas del vendedor
que mas factur. Tenga en cuenta que el procedimiento debe recibir la fecha inicial y la fecha final,
para estimar el lapso de tiempo en el que se calcular el acumulado.
3 de 5
http://hermosaprogramacion.blogspot.com/2014/06/mysql-cursores.html
El anterior requerimiento se crea a partir de una minibase de datos para un sistema de facturacin que tiene el
siguiente diagrama entidad-relacin:
Antes de desarrollar el procedimiento, especificaremos el flujo en las entradas, procesos y salidas del programa:
Entradas
4 de 5
http://hermosaprogramacion.blogspot.com/2014/06/mysql-cursores.html
loop1: LOOP
-- Obtenemos la primera fila en la variables correspondientes
FETCH mejor_vendedor_cursor INTO ID_VENDEDOR, ACUMULADO_VENTAS;
-- Si el cursor se qued sin elementos,
-- entonces nos salimos del bucle
IF @hecho THEN
LEAVE loop1;
END IF;
-- Guardamos el acumulado de ventas y el cdigo
-- si el vendedor actual tiene mejores resultados
IF ACUMULADO_VENTAS>=TEMPV THEN
SET TEMPV = ACUMULADO_VENTAS;
SET TEMPID = ID_VENDEDOR;
END IF;
END LOOP loop1;
-- Cerramos el cursor
CLOSE mejor_vendedor_cursor;
-- Imprimimos el cdigo y total acumulado de ventas del vendedor
SELECT
END//
DELIMITER ;
MySQL no permite que los cursores lean los resultados de una consulta desde el ultimo elemento
hasta el primero. Usa ORDER BY para organizar tu mismo la informacin.
MySQL no permite que saltemos a una fila en particular para ahorrarnos tiempo, debemos recorrer
obligatoriamente uno a uno los resultados.
Artculos relacionados
Bloques de
DAY
instrucciones en
SQL
YEAR
DATEDIFF
MONTH
No hay comentarios:
Publicar un comentario en la entrada
5 de 5
http://hermosaprogramacion.blogspot.com/2014/06/mysql-cursores.html
Comentar como:
Publicar
Pgina principal
Entrada antigua
FEED
Cursores en MySQL
Borrar procedimientos en SQL Server
Modificar procedimientos en SQL Server
Crear un procedimiento en SQL Server
SHOW CREATE PROCEDURE, mostrar un procedimiento en MySQL
Directorios