Você está na página 1de 13

11/04/2016

Curso Base de Datos

Manejo de cursores en MySql

11/04/2016

Objetivo
2

Mostrar el uso de cursores en el manejo


de las bases de datos

11/04/2016

Contexto
3

Cuando
consultamos
tablas
con
SELECT,
MySQL
arrojaba
rpidamente los registros en pantalla de
un solo golpe, sin embargo, hay
momentos donde se requiere acceder a
cada registro de forma individual.

Qu es un cursor?
4

Existen unos tipos de controles llamados


cursores que son tiles para recorrer los
registros que devuelve una consulta.
Un cursor permite acceder en tiempo
real a los datos de cada fila de una
consulta. Este mecanismo es de gran
utilidad cuando usamos MySQL con
aplicativos

11/04/2016

Como usar Cursores en MySQL?


5

Para implementar un cursor debemos


conocer 4 fases de su funcionamiento:
Declaracin
Apertura
Lectura
Cierre

1. DECLARACION
6

Al igual que una variable, los cursores se


declaran con la sentencia DECLARE.
DECLARE nombre_cursor CURSOR FOR
_______ ;

11/04/2016

1. DECLARACION
7

ejemplo:
DECLARE cursor_edad CURSOR FOR

SELECT EDAD FROM CLIENTE WHERE


NOMBRE LIKE 'a%';

2. APERTURA
8

OPEN nombre_cursor;
Al abrir el cursor este sita un puntero a
donde inician las filas o registros de la
consulta

11/04/2016

3. LECTURA
9

FETCH nombre_cursor INTO variable1,variable2,...

3. LECTURA
10

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.

11/04/2016

3. LECTURA
11

Es importante tener variables declaradas


para almacenar temporalmente los
datos de las columnas de cada fila,
generadas por la consulta.
Estas variables deben tener el mismo tipo
de dato que el valor de la columna a
almacenar,
y luego relacionarlas con la
sentencia INTO.

3. LECTURA 12

si quisiramos almacenar der la base de


datos hr el id, nombre y apellido del
primer empleado de la tabla employees
, hacemos lo siguiente:

11/04/2016

3. LECTURA 13

--

Debemos declarar las variables para el cursor dentro del

-- trigger o PA
DECLARE ID INT;
DECLARE NOMBRE VARCHAR(100);
DECLARE APELLIDO VARCHAR(100);
DECLARE cursor_cliente CURSOR FOR SELECT employee_id,
firts_name, last_name FROM employees;
OPEN cursor_cliente;
FETCH cursor_cliente INTO ID,NOMBRE,APELLIDO; CLOSE
cursor_cliente;

3. LECTURA - Ejemplo
14

create procedure prueba_lectura()


BEGIN
DECLARE ID INT; DECLARE NOMBRE VARCHAR(100);
DECLARE APELLIDO VARCHAR(100);
DECLARE cursor_cliente CURSOR FOR SELECT employee_id, firSt_name, last_name FROM
employees;
OPEN cursor_cliente;
SELECT ID,NOMBRE,APELLIDO;
FETCH cursor_cliente INTO ID,NOMBRE,APELLIDO;
SELECT ID,NOMBRE,APELLIDO;
CLOSE cursor_cliente;
END
//
Delimiter ;
-- para probarlo lo ejecutamos de la siguiente manera
Call procedure prueba_lectura();

11/04/2016

3. LECTURA En un ciclo
15

Si queremos recorrer todas las filas de la consulta, necesitaremos


de alguna estructura repetitiva.

Incluir el comando FETCH dentro de un CICLO permite leer todos


los resultados de un cursor.

Cuando el cursor llegue al final de los resultados de la consulta,


entonces el CICLO DEBERIA TERMINAR.

Pero terminar un bucle de este tipo necesita una condicin de


parada especial en MySQL.

3. LECTURA En un ciclo
16

Existen manejadores de errores en MySQL para


esta tarea
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 CICLO.

11/04/2016

3. LECTURA En un ciclo
17

Declaracin de un manejador de error tipo NOT


FOUND
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET @fin = TRUE;

Aqu indicamos que si ocurre un error tipo NOT


FOUND, entonces asignemos a la variable @fin el
valor de TRUE. Con esa variable podremos manejar
la terminacin de nuestro ciclo mas adelante.

4. CIERRE
18

Una vez ledo todos los resultados del


cursor, procedemos a cerrar y limpiar
espacios de memoria con CLOSE.

CLOSE nombre_cursor;

11/04/2016

Ejemplo Ciclo
19

delimiter //
create procedure ciclo_fetch()
BEGIN
DECLARE ID INT;
DECLARE NOMBRE VARCHAR(100);
DECLARE APELLIDO VARCHAR(100);
DECLARE FIN BOOLEAN DEFAULT 0;
DECLARE cursor_cliente CURSOR FOR SELECT employee_id, firSt_name, last_name
FROM employees;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET FIN=1;
OPEN cursor_cliente;
-- Contina en la siguiente pgina

Ejemplo Ciclo
20

-- viene de la pgina anterior


Repeat
FETCH cursor_cliente INTO ID,NOMBRE,APELLIDO;
SELECT ID,NOMBRE,APELLIDO;
UNTIL FIN END REPEAT;
CLOSE cursor_cliente;
END;
//
delimiter ;

10

11/04/2016

Modelo E-R base de datos hr


21

Referencias de inters

11

11/04/2016

Referencias de inters
23

Introduction to MySQL cursor


Creacin de Cursores en MySQL
Stored Procedure en MySQL (parte 2)
[iterate, cursores y handlers]
Ejemplo cursores

24

11/04/2016

12

11/04/2016

Mis apuntes
25

Mis apuntes
26

13

Você também pode gostar