BD Cursores

Embed Size (px)

Citation preview

  • 8/17/2019 BD Cursores

    1/13

    11/04/20

    Manejo de cursores en MySql

    Curso Base de Datos

    11/04/2016

    1

    Objetivo

    2

    Mostrar el uso de cursores en el manejode las bases de datos

  • 8/17/2019 BD Cursores

    2/13

    11/04/20

    Contexto

    3

    Cuando consultamos tablascon SELECT, MySQL arrojabarápidamente los registros en pantalla deun solo golpe, sin embargo, haymomentos donde se requiere acceder acada registro de forma individual.

    ¿Qué es un cursor?

    4

    Existen unos tipos de controles llamadoscursores que son útiles para recorrer losregistros que devuelve una consulta.

    Un cursor permite acceder en tiemporeal a los datos de cada fila de unaconsulta. Este mecanismo es de granutilidad cuando usamos MySQL conaplicativos

    http://www.hermosaprogramacion.com/2014/05/SELECT-SQL.htmlhttp://www.hermosaprogramacion.com/2014/05/SELECT-SQL.html

  • 8/17/2019 BD Cursores

    3/13

    11/04/20

    ¿Como usar Cursores en MySQL?

    5

    Para implementar un cursor debemosconocer 4 fases de su funcionamiento:

    Declaración

    Apertura

    Lectura

    Cierre

    1. DECLARACION

    6

    Al igual que una variable, los cursores sedeclaran con la sentencia DECLARE.

    DECLARE nombre_cursor CURSOR FOR

     _______ ;

    http://www.hermosaprogramacion.com/2014/06/mysql-sql-server-variables.htmlhttp://www.hermosaprogramacion.com/2014/06/mysql-sql-server-variables.html

  • 8/17/2019 BD Cursores

    4/13

    11/04/20

    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 sitúa un puntero a

    donde inician las filas o registros de laconsulta

  • 8/17/2019 BD Cursores

    5/13

    11/04/20

    3. LECTURA

    9

    FETCH nombre_cursor INTO variable1,variable2,...

    3. LECTURA

    10

    La lectura de los resultados de un cursor sehace con el comando FETCH.

    Este nos permite acceder a la primer filagenerada por la consulta.

    Si se vuelve a usar el cursor pasa a apuntara la segunda fila, luego a la tercer y asísucesivamente hasta que el cursor no tengaresultados que referenciar.

  • 8/17/2019 BD Cursores

    6/13

    11/04/20

    3. LECTURA

    11

    Es importante tener variables declaradaspara almacenar temporalmente losdatos 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 aalmacenar,

    y luego relacionarlas con lasentencia INTO.

    3. LECTURA -

    12

    si quisiéramos almacenar der la base dedatos hr el id ,  nombre y  apellido delprimer empleado de la tabla employees, hacemos lo siguiente:

    http://www.hermosaprogramacion.com/2014/05/tipos-datos-sql.htmlhttp://www.hermosaprogramacion.com/2014/05/tipos-datos-sql.htmlhttp://www.hermosaprogramacion.com/2014/05/tipos-datos-sql.htmlhttp://www.hermosaprogramacion.com/2014/05/tipos-datos-sql.htmlhttp://www.hermosaprogramacion.com/2014/05/tipos-datos-sql.html

  • 8/17/2019 BD Cursores

    7/13

    11/04/20

    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; CLOSEcursor_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 FROMemployees;

    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();

  • 8/17/2019 BD Cursores

    8/13

    11/04/20

    3. LECTURA – En un ciclo

    15

    Si queremos recorrer todas las filas de la consulta, necesitaremosde alguna estructura repetitiva.

    Incluir el comando FETCH dentro de un CICLO permite leer todoslos 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 condición deparada especial en MySQL.

    3. LECTURA – En un ciclo

    16

    Existen manejadores de errores en MySQL paraesta tarea

    Cuando usamos FETCH en el cursor, pero ya no hay masfilas por retornar, MySQL arroja un error llamado "02000

    NO DATA FECH".

    Así que lo que debemos hacer es crearun manejador para indicar que cuando suceda ese error,el programa no termine, pero que si termine el CICLO.

  • 8/17/2019 BD Cursores

    9/13

    11/04/20

    3. LECTURA – En un ciclo

    17

    Declaración de un manejador de error tipo NOTFOUND

    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 elvalor de TRUE. Con esa variable podremos manejarla terminación de nuestro ciclo mas adelante.

    4. CIERRE

    18

    Una vez leído todos los resultados delcursor, procedemos a cerrar y limpiarespacios de memoria con CLOSE.

    CLOSE nombre_cursor;

  • 8/17/2019 BD Cursores

    10/13

  • 8/17/2019 BD Cursores

    11/13

    11/04/20

    Modelo E-R base de datos hr

    21

    Referencias de interés

  • 8/17/2019 BD Cursores

    12/13

    11/04/20

    Referencias de interés

    23

    Introduction to MySQL cursor Creación de Cursores en MySQL

    Stored Procedure en MySQL (parte 2) [iterate, cursores y handlers]

    Ejemplo cursores

    11/04/2016

    24

    http://www.mysqltutorial.org/mysql-cursor/http://www.mysqltutorial.org/mysql-cursor/http://www.hermosaprogramacion.com/2014/06/mysql-cursores/http://www.hermosaprogramacion.com/2014/06/mysql-cursores/http://cassianinet.blogspot.mx/2011/06/stored-procedure-en-mysql-parte-2.htmlhttp://cassianinet.blogspot.mx/2011/06/stored-procedure-en-mysql-parte-2.htmlhttp://cassianinet.blogspot.mx/2011/06/stored-procedure-en-mysql-parte-2.htmlhttp://cassianinet.blogspot.mx/2011/06/stored-procedure-en-mysql-parte-2.htmlhttp://taller-bases-datos-itcj.blogspot.mx/2012/11/ejemplo-cursores.htmlhttp://taller-bases-datos-itcj.blogspot.mx/2012/11/ejemplo-cursores.htmlhttp://taller-bases-datos-itcj.blogspot.mx/2012/11/ejemplo-cursores.htmlhttp://cassianinet.blogspot.mx/2011/06/stored-procedure-en-mysql-parte-2.htmlhttp://www.hermosaprogramacion.com/2014/06/mysql-cursores/http://www.mysqltutorial.org/mysql-cursor/

  • 8/17/2019 BD Cursores

    13/13

    11/04/20

    Mis apuntes

    25

    Mis apuntes

    26