En base de datos un Cursor es un mecanismo el cual nos permite procesar fila por fila el resultado de una consulta.
Como sabemos SQL es un lenguaje orientado a conjuntos. Si nosotros deseamos alterar ciertos elementos en nuestra colección tendremos que hacerlo mediante condicione. Única y exclusivamente los elementos que cumpla con dichas condiciones podrán ser alterados. Con los cursores podremos trabajar con cada uno de los elementos (filas) de nuestra consulta sin tener que obtener nuevos conjuntos. Esto nos permitirá ser mucho más flexibles al momento de manipular la información.
Para nosotros poder hacer uso de un cursor será necesario seguir los siguientes pasos.
- Crear un cursor a partir de una sentencia SQL.
- Apertura del cursor.
- Acceso a datos.
- Cierre del cursor.
Es importante mencionar que en MySQL los cursores solo podrán ser utilizados dentro de stored procedures.
Veamos un ejemplo.
1.-Crear un stored procedure el cual incremente en 10 el número de páginas de cada libro (tabla libros). En consola debemos visualizar el título, el anterior número de páginas y el actual número de páginas de cada libro.
Bien, este ejemplo nos permitirá comprender de una mejor manera el uso de cursores.
Veamos como pudiese quedar nuestro stored procedure.
DELIMITER //
DROP PROCEDURE IF EXISTS facilito_procedure//
CREATE PROCEDURE facilito_procedure()
BEGIN
DECLARE var_id INTEGER;
DECLARE var_paginas INTEGER;
DECLARE var_titulo VARCHAR(255);
DECLARE var_final INTEGER DEFAULT 0;
DECLARE cursor1 CURSOR FOR SELECT libro_id, titulo, paginas FROM libros;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_final = 1;
OPEN cursor1;
bucle: LOOP
FETCH cursor1 INTO var_id, var_titulo, var_paginas;
IF var_final = 1 THEN
LEAVE bucle;
END IF;
UPDATE libros SET paginas = var_paginas + 10 WHERE libro_id = var_id;
SELECT
var_titulo AS 'titulo',
var_paginas AS 'Anterior',
paginas AS 'Incremento'
FROM libros WHERE libro_id = var_id;
END LOOP bucle;
CLOSE cursor1;
END//
DELIMITER ;
Dentro del stored procedure lo primero que hacemos es declarar todas las variables que usaremos. En este caso como trabajaremos con el título y el número de páginas de cada libro declaró tres nuevas variables. var_id, var_paginas, var_titulo.
Para tener un control sobre la iteración de cada uno de los elementos en la consulta declaró una cuarta variable llamada var_final, cuyo valor comienza en 0.
Una vez hemos declarado todas las variables procedemos a crear nuestro cursor. El cursor se creará a partir de una consulta SQL. En este caso la consulta no es demasiado compleja, sin embargo, si así lo deseamos podemos crear un cursos a partir de una consulta con joins, order, group etc...
Con la sentencia
DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_final = 1;
Indicamos que una vez todos los elementos (filas) dentro de nuestro cursor hayan sido iterados la variable var_final tomará un nuevo valor, de 0 a 1.
Para comenzar la iteración de los elementos será necesario abrir el cursor.
OPEN cursor1;
La iteración la logramos utilizando un Loop, el cual será controlado a partir de la variable var_final.
IF var_final = 1 THEN
--Si ya no existen más elementos finalizamos el ciclo.
LEAVE bucle;
END IF;
Al nosotros usar la cláusula Fetch obtenemos el elemento (fila) actual de nuestra consulta y avanzamos al siguiente elemento.
En este caso como en nuestra consulta hemos obtenido 3 columnas (id, titulo, páginas) asignamos el valor de cada una de las columnas a nuestras variables. Es importante mencionar que los valores podrán ser asignados únicamente a variables del mismo tipo, no podremos asignar un varchar a una variable de tipo integer.
El orden es importante.
FETCH cursor1 INTO var_id, var_titulo, var_paginas;
Una vez hemos realizado todas las tareas correspondientes y se han iterado todos los elementos (filas) el siguiente paso será cerrar el cursor.
close cursor1
Para ejecutar nuestro stored prcedure ejecutaremos la siguiente sentencia.
call facilito_procedure();
-
check_circle_outlineMódulo 1 | 8 clases
Introdución
expand_more -
check_circle_outlineMódulo 2 | 3 clases
Servidor de base de datos
expand_more -
check_circle_outlineMódulo 3 | 10 clases
Base de datos y tablas
expand_more -
check_circle_outlineMódulo 4 | 8 clases
Restricciones
expand_more -
check_circle_outlineMódulo 5 | 2 clases
Modificar tablas
expand_more -
check_circle_outlineMódulo 6 | 12 clases
Sentencias basicas
expand_more -
check_circle_outlineMódulo 7 | 8 clases
Funciones
expand_more -
check_circle_outlineMódulo 8 | 12 clases
Sentencias avanzadas
expand_more -
check_circle_outlineMódulo 9 | 7 clases
Joins
expand_more -
check_circle_outlineMódulo 10 | 4 clases
Vistas
expand_more -
check_circle_outlineMódulo 11 | 7 clases
Procedimientos
expand_more -
check_circle_outlineMódulo 12 | 4 clases
Transacciones
expand_more -
check_circle_outlineMódulo 13 | 5 clases
Extras
expand_more -
check_circle_outlineMódulo 14 | 5 clases
Triggers
expand_more -
check_circle_outlineMódulo 15.-
Examen del curso
expand_more-
done_all
Examen
Examen final del curso
-