0% encontró este documento útil (0 votos)
192 vistas5 páginas

Creación de Cursores en MySQL

El documento explica cómo crear y usar cursores en MySQL. Los cursores permiten acceder a las filas devueltas por una consulta de forma individual. Para implementar un cursor se deben seguir 4 pasos: declaración, apertura, lectura y cierre. El cursor apunta a la primera fila devuelta y se usa un bucle y la sentencia FETCH para recorrer todas las filas de manera secuencial.

Cargado por

Eddy Richard
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
192 vistas5 páginas

Creación de Cursores en MySQL

El documento explica cómo crear y usar cursores en MySQL. Los cursores permiten acceder a las filas devueltas por una consulta de forma individual. Para implementar un cursor se deben seguir 4 pasos: declaración, apertura, lectura y cierre. El cursor apunta a la primera fila devuelta y se usa un bucle y la sentencia FETCH para recorrer todas las filas de manera secuencial.

Cargado por

Eddy Richard
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

Creación de Cursores 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.
¿Qué son los Cursores en MySQL?
Cuando consultábamos tablas con SELECT, MySQL arrojaba rápidamente los registros en pantalla,
como resultado de la consulta ejecutada. Pero hay momentos donde necesitaremos acceder a cada
registro de forma individual. Lo que quiere decir que un cursor permite acceder en tiempo real a los
datos de cada fila de una consulta. Este mecanismo es de gran utilidad cuando vayamos a
comunicar MySQL con aplicativos o realizar consultas complejas.
¿Cómo usar Cursores en MySQL?
Para implementar un cursor debemos tener en cuenta 4 fases de su funcionamiento:
 Declaración
 Apertura
 Lectura
 Cierre

1. DECLARACION
Al igual que una variable, los cursores se declaran con la sentencia DECLARE. Debemos
declararlos después de nuestras variables corrientes, de lo contrario MySQL, generará un error.
Veamos la sintaxis:
DECLARE nombre_cursor CURSOR FOR;
Este sería un ejemplo: Declarar un cursor que muestre la lista de los clientes cuyo apellido
comienza con la letra c.
DECLARE CURSOR_CLIENTE CURSOR FOR
SELECT CONCAT(P.APE,' ',P.NOM)
FROM CLIENTE C, PERSONA P
WHERE C.DNI=P.DNI AND P.APE LIKE 'C%';

NOTA: Tener en cuenta que el objeto cursor_cliente lo que hace es apuntar a la dirección de
memoria del primer resultado de dicha consulta, y para guardar los datos de la consulta a la cual
está referenciando, se deberá implementar otros mecanismos dentro de la consulta a implementar.
2. APERTURA
En la fase de declaración 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
leídos por MySQL, por lo tanto se producirá un error.
Debes tener en cuenta que al abrir el cursor este sitúa 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 primera fila generada por la consulta. Si se vuelve a usar el cursor pasa a apuntar a la segunda
fila, luego al tercer y así sucesivamente hasta que el cursor no tenga resultados que referenciar.
FETCH nombre_cursor INTO variable1,variable2,...

4. CIERRE
Una vez leído todos los resultados del cursor, procedemos a cerrar y limpiar espacios de memoria
con CLOSE.
CLOSE nombre_cursor;
NOTA: Es importante tener variables declaradas para almacenar temporalmente los datos de las
columnas de cada fila, generadas por la consulta. Estas variables lógicamente deben tener el mismo
tipo de dato que el valor de la columna a almacenar, y luego relacionarlas con la sentencia INTO.
Por ejemplo, implementar un cursor que almacene los apellidos y nombres, ruc y la persona de
contacto del primer proveedor registrado en el sistema.
DELIMITER$$
CREATE PROCEDURE PROVERDOR_CUR()
BEGIN
#DECLARACION DE VARIABLES PARA EL CURSOS
DECLARE APE_NOM VARCHAR(100);
DECLARE RUC VARCHAR(11);
DECLARE CONTACTO VARCHAR(100);
#DECLARAMOS EL CURSOR
DECLARE CUR_PROV CURSOR FOR
#LE INSTANCIAMOS LA CONSULTA AL CURSOR
SELECT CONCAT(P.APE,' ',P.NOM),P.RUC,PR.PERSONA_CONTACTO
FROM PERSONA P, PROVEEDORES PR
WHERE P.DNI=PR.PERSONA_DNI;
#ABRIMOS EL CURSOR
OPEN CUR_PROV;
#LEEMOS EL CURSOR
FETCH CUR_PROV INTO APE_NOM,RUC,CONTACTO;
#CERRAMOS EL CURSOR
CLOSE CUR_PROV;
SELECT APE_NOM,RUC,CONTACTO;
END$$
DELIMITER;

Para recorrer todas las filas de la consulta, necesitaremos de alguna estructura repetitiva, 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 condición de parada especial en MySQL. Existen manejadores de
errores en MySQL para esta tarea.

Cuando usamos FETCH en el cursor, pero ya no hay más 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.

-- Declaración de un manejador de error tipo NOT FOUND


DECLARE CONTINUE HANDLER FOR NOT FOUND SET @hecho = TRUE;
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 terminación de nuestro bucle más
adelante.
Ejemplo: Implementar un procedimiento que muestre los registros de la tabla proveedor, teniendo
en cuenta que cada vez que se ejecute el procedimiento deberá mostrar los registros por separado
desde la fila 1 hasta la última fila, Además el resultado deberá mostrar los apellidos, nombres, ruc, y
la edad del proveedor. Tener en cuenta que el usuario tendrá la opción de mostrar solo a los
proveedores que fueron registrados en el sistema en un determinado intervalo de fechas, el mismo
que será definido por el usuario.
Usando LOOP
DELIMITER$$
CREATE PROCEDURE CURSOR_PROVE(FECINI DATE,FECFIN DATE)
BEGIN
#DECLARACION DE VARIABLES PARA EL CURSOR
DECLARE APE_NOM VARCHAR(100);
DECLARE RUC VARCHAR(11);
DECLARE EDAD INT;
#DECLARAMOS EL CURSOR
DECLARE CURSOR_PROV CURSOR FOR
#DEFINIMOS LA CONSULTA
SELECT CONCAT(P.APE,' ',P.NOM),P.RUC,
TIMESTAMPDIFF(YEAR,P.FEC_NAC,CURDATE())
FROM PERSONA P, PROVEEDORES PR
WHERE P.DNI=PR.PERSONA_DNI AND
PR.FEC_CONTROL BETWEEN DATE(FECINI) AND DATE(FECFIN);
#Declaración de un manejador de error tipo NOT FOUND
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @hecho = TRUE;
#ABRIMOS EL CURSOR
OPEN CURSOR_PROV;
#Comenzamos nuestro bucle de lectura
LOOP1:LOOP
#Obtenemos la primera fila en la variables correspondientes
FETCH CURSOR_PROV INTO APE_NOM,RUC,EDAD;
SELECT APE_NOM,RUC,EDAD;
#Si el cursor se quedó sin elementos,
#entonces nos salimos del bucle
IF @hecho THEN
LEAVE LOOP1;
END IF;
END LOOP LOOP1;
#CERRAMOS EL CURSOR
CLOSE CURSOR_PROV;
END$$
DELIMITER;
IMPLEMENTAR UN PROCEDIMIENTO QUE SE ENCUENTRE DEFINIDO POR UN
CURSOR QUE MUESTRE EN UNA SOLA FILA EL NUMERO DE RUC DE TODOS LOS
PROVEEDORES REGISTRADOS EN EL SISTEMA VENTAS.

DELIMITER$$
CREATE PROCEDURE CURSOR_RUC(C_RUC VARCHAR(200))
BEGIN
DECLARE RUC VARCHAR(11) DEFAULT "";
DECLARE HAY INT DEFAULT 0;
DECLARE CURSOR_RUC CURSOR FOR
SELECT P.RUC
FROM PERSONA P, PROVEEDORES PR
WHERE P.DNI=PR.PERSONA_DNI;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET HAY= 1;
OPEN CURSOR_RUC;
LOOP1:LOOP
FETCH CURSOR_RUC INTO RUC;
SET C_RUC = CONCAT(RUC,";",C_RUC);
IF HAY=1 THEN
LEAVE LOOP1;
END IF;
END LOOP LOOP1;
SELECT C_RUC;
CLOSE CURSOR_RUC;
END$$
DELIMITER;
SET @C_RUC="";
CALL CURSOR_RUC(@C_RUC);

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy