C2 Cursores

download C2 Cursores

of 15

description

los cursores en bases de datos

Transcript of C2 Cursores

  • CURSORES

    Administracin de Bases de Datos

    Ing. Luis Reyes

  • DBD II - Ing. Luis Reyes

    Que son los cursores?

    Los cursores son una herramienta que

    permite recorrer el resultado de una

    consulta SQL y realizar operaciones

    en cada paso de ella

  • DBD II - Ing. Luis Reyes

    Caracteristicas

    Se soportan cursores simples dentro de

    procedimientos y funciones almacenadas.

    La sintaxis es la de SQL empotrado.

    Los cursores no son sensibles, son de slo

    lectura, y no permiten scrolling. No sensible

    significa que el servidor puede o no hacer

    una copia de su tabla de resultados.

  • DBD II - Ing. Luis Reyes

    Los cursores deben declararse antes de

    declarar los HANDLERS, y las variables y

    condiciones deben declararse antes de

    declarar cursores HANDLERS.

    Los cursores permiten recuperar las tuplas

    resultantes de una consulta SELECT dentro

    de un PROCEDIMIENTO ALMACENADO

  • DBD II - Ing. Luis Reyes

    Sintaxis

    Los cursores se declaran de la siguiente forma: declare cursor for

    Para acceder al resultado de la consulta debemos primero abrir el cursor: open

  • DBD II - Ing. Luis Reyes

    Sintaxis

    Una vez abierto se puede recuperar cada

    tupla mediante la siguiente sentencia: fetch into

    [...,]

    recupera la prxima tupla (si existe) utilizando el

    cursor especificado y avanza el puntero a la

    siguiente tupla.

    Una vez utilizado podemos cerrar el cursor

    mediante: close

  • DBD II - Ing. Luis Reyes

    Declarar cursores

    DECLARE cursor_name CURSOR

    FOR select_statement

    Este comando declara un cursor.

    Pueden definirse varios cursores en

    una rutina, pero cada cursor en un

    bloque debe tener un nombre nico.

    El comando SELECT no puede tener

    una clusula INTO

  • DBD II - Ing. Luis Reyes

    Sentencia de cursor OPEN

    OPEN cursor_name

    Este comando abre un cursor

    declarado prviamente.

  • DBD II - Ing. Luis Reyes

    Sentencia de cursor FETCH

    FETCH cursor_name INTO var_name [, var_name] ...

    Este comando trata el siguiente registro

    (si existe) usando el cursor abierto que se especifique, y avanza el puntero del cursor.

    Si no existen ms registros disponibles, ocurrir una condicin de Sin Datos con el valor SQLSTATE 02000. Puede configurar un manejador (handler)

  • DBD II - Ing. Luis Reyes

    Sentencia de cursor CLOSE

    CLOSE cursor_name

    Este comando cierra un cursor abierto

    previamente.

    Si no se cierra explcitamente, un

    cursor se cierra al final del comando

    compuesto en que se declara.

  • DBD II - Ing. Luis Reyes

    Ejemplo 1 CREATE PROCEDURE p25 (OUT return_val INT) BEGIN

    DECLARE a,b INT; DECLARE cur_1 CURSOR FOR SELECT valor FROM t; DECLARE continue HANDLER FOR NOT FOUND SET b = 1; OPEN cur_1; REPEAT

    FETCH cur_1 INTO a; UNTIL b = 1

    END REPEAT; CLOSE cur_1; SET return_val = a;

    END; //

  • DBD II - Ing. Luis Reyes

    Ejemplo 2 ... CREATE PROCEDURE inc_saldo (IN monto DECIMAL(7,2)) # incrementa el saldo en el valor de monto,

    # para aquellas cuentas cuyo saldo

  • DBD II - Ing. Luis Reyes

    OPEN c; # abro el cursor (ejecuta la consulta asociada)

    FETCH c INTO nro_cuenta; # recupero la primera fila en la variable

    WHILE NOT fin DO

    UPDATE cuentas # actualizo el saldo de la cuenta

    SET saldo = saldo + monto;

    WHERE numero = nro_cuenta;

    FETCH c INTO nro_cuenta; # recupero la prxima fila en la variable

    END WHILE;

    CLOSE c; # cierro el cursor

    END;

  • DBD II - Ing. Luis Reyes

    Ejemplo 3 ...

    CREATE PROCEDURE curdemo()

    BEGIN

    DECLARE done INT DEFAULT 0;

    DECLARE a CHAR(16);

    DECLARE b,c INT;

    DECLARE cur1 CURSOR FOR SELECT id, data FROM test.t1;

    DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

    DECLARE continue HANDLER FOR SQLSTATE '02000' SET done =

    1;

    OPEN cur1;

    OPEN cur2;

  • DBD II - Ing. Luis Reyes

    REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2; END