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();
-
Módulo 1 | 8 clases
Introdución
expand_more-
play_circle_outline
Clase 1
Introducción
-
play_circle_outline
Clase 2
¿Qué son las bases de datos?
-
play_circle_outline
Clase 3
Modelo relacional
-
play_circle_outline
Clase 4
Lenguaje SQL
-
play_circle_outline
Clase 5
Instalación MySQL windows
-
play_circle_outline
Clase 6
Instalación MySQL Linux
-
play_circle_outline
Clase 7
Instalación MySQL Mac OS
-
play_circle_outline
Clase 8
Restablecer contraseña root MySQL
-
-
Módulo 2 | 3 clases
Servidor de base de datos
expand_more -
Módulo 3 | 10 clases
Base de datos y tablas
expand_more-
play_circle_outline
Clase 1
Crear tablas
-
play_circle_outline
Clase 2
Tipos de datos
-
play_circle_outline
Clase 3
Listar y eliminar tablas
-
play_circle_outline
Clase 4
Obtener información de una tabla
-
play_circle_outline
Clase 5
Crear tablas a partir de otras
-
play_circle_outline
Clase 6
Insertar registros
-
play_circle_outline
Clase 7
Insertar múltiples registros
-
play_circle_outline
Clase 8
Ejecutar archivos .SQL
-
play_circle_outline
Clase 9
Condicionar sentencias
-
play_circle_outline
Clase 10
Consultas rápidas
-
-
Módulo 4 | 8 clases
Restricciones
expand_more-
play_circle_outline
Clase 1
Restricciones
-
play_circle_outline
Clase 2
Valores únicos y nulos
-
play_circle_outline
Clase 3
Valores por defualt
-
play_circle_outline
Clase 4
Números positivos
-
play_circle_outline
Clase 5
Tipo Enum
-
play_circle_outline
Clase 6
Llaves primarias
-
play_circle_outline
Clase 7
Llaves Foraneas
-
play_circle_outline
Clase 8
Implementación de restricciones
-
-
Módulo 5 | 2 clases
Modificar tablas
expand_more -
Módulo 6 | 12 clases
Sentencias basicas
expand_more-
play_circle_outline
Clase 1
¿Cómo se ejecutan las sentencias SQL?
-
play_circle_outline
Clase 2
Obtener registros mediante condiciones
-
play_circle_outline
Clase 3
Operadores lógicos
-
play_circle_outline
Clase 4
Registros nulos
-
play_circle_outline
Clase 5
Registros mediante rangos
-
play_circle_outline
Clase 6
Búsqueda por listas
-
play_circle_outline
Clase 7
Registros unicos
-
play_circle_outline
Clase 8
Alías
-
play_circle_outline
Clase 9
Actualizar registros
-
play_circle_outline
Clase 10
Eliminar registros
-
play_circle_outline
Clase 11
Eliminación en cascada
-
play_circle_outline
Clase 12
Restaurar definición de una tabla
-
-
Módulo 7 | 8 clases
Funciones
expand_more-
play_circle_outline
Clase 1
Funciones en SQL
-
play_circle_outline
Clase 2
Funciones sobre strings
-
play_circle_outline
Clase 3
Funciones sobre números
-
play_circle_outline
Clase 4
Funciones sobre fechas
-
play_circle_outline
Clase 5
Funciones sobre condiciones
-
play_circle_outline
Clase 6
Crear función
-
play_circle_outline
Clase 7
Listar funciones
-
play_circle_outline
Clase 8
Ejecutar sentencias dentro de funciones
-
-
Módulo 8 | 12 clases
Sentencias avanzadas
expand_more-
play_circle_outline
Clase 1
Búsqueda mediante strings
-
play_circle_outline
Clase 2
Expresiones regulares
-
play_circle_outline
Clase 3
Ordenar registros
-
play_circle_outline
Clase 4
Limitar registros
-
play_circle_outline
Clase 5
¿Qué son las funciones de agreación?
-
play_circle_outline
Clase 6
Funciones de agregación
-
play_circle_outline
Clase 7
Agrupamiento
-
play_circle_outline
Clase 8
Condiciones bajo agrupamiento
-
play_circle_outline
Clase 9
Unir resultados
-
play_circle_outline
Clase 10
Sub consultas
-
play_circle_outline
Clase 11
Validar registros
-
play_circle_outline
Clase 12
Ejercicios
-
-
Módulo 9 | 7 clases
Joins
expand_more-
play_circle_outline
Clase 1
Trabajo con múltiples tablas
-
play_circle_outline
Clase 2
Inner join
-
play_circle_outline
Clase 3
Sub clausula using
-
play_circle_outline
Clase 4
Left Join
-
play_circle_outline
Clase 5
Right Join
-
play_circle_outline
Clase 6
Múltiples joins
-
play_circle_outline
Clase 7
Productos cartesianos
-
-
Módulo 10 | 4 clases
Vistas
expand_more -
Módulo 11 | 7 clases
Procedimientos
expand_more-
play_circle_outline
Clase 1
Procedimientos almacenados
-
play_circle_outline
Clase 2
Crear procedimientos
-
play_circle_outline
Clase 3
Eliminar procedimientos
-
play_circle_outline
Clase 4
Obtener valores
-
play_circle_outline
Clase 5
Condicionales
-
play_circle_outline
Clase 6
Casos
-
play_circle_outline
Clase 7
Ciclos
-
-
Módulo 12 | 4 clases
Transacciones
expand_more -
Módulo 13 | 5 clases
Extras
expand_more -
Módulo 14 | 5 clases
Triggers
expand_more -
check_circle_outlineMódulo 15
Examen del curso
expand_more-
done_all
Examen
Examen final del curso
-