dissabte, 1 de gener del 2000

Cursores

¿Qué es un cursor?
Un cursor permite acceder en tiempo real a los datos de cada fila de una consulta. Este mecanismo es de gran utilidad cuando vayamos a comunicar MySQL con aplicativos o realizar consultas complejas.

Declaración
DECLARE cursor_name CURSOR FOR select_statement
Ejemplo:
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;

Sentencia OPEN
Este comando abre un cursor declarado préviamente.
Sintaxi: OPEN cursor_name
Ejemplo: OPEN cur1;

Sentencia FETCH
La lectura de los resultados de un cursor se hace con el comando FETCH. Este nos permite acceder a la primera fila generada por la consulta. Si se vuelve a usar el cursor pasa a apuntar a la segunda fila, luego a la tercera y así sucesivamente hasta que el cursor no tenga resultados que referenciar.
Incluir el comando FETCH dentro de un bucle permite leer todos los resultados de un cursor. Cuando el cursor llegue al final de los resultados de la consulta, entonces el bucle termina. Pero terminar un bucle de este tipo necesita una condición de parada especial en MySQL.
Sintaxi:
FETCH cursor_name INTO var_name [, var_name] ...
Ejemplo:
FETCH cur1 INTO a, b; donde DECLARE a CHAR(16); DECLARE b,c INT

Sentencia CLOSE
Una vez leído todos los resultados del cursor, procedemos a cerrar y limpiar espacios de memoria con CLOSE.
Sintaxi:
CLOSE nombre_cursor;
Ejemplo:
CLOSE cur1; 

Ejemplo

BEGIN
DECLARE variable TIPOVARIABLE;
DECLARE error INT DEFAULT 0;
DECLARE cursor1 cursor for SELECT X FROM Y;
DECLARE CONTINUE handler for sqlstate '02000' set error = 1;

open cursor1;

repeat
fetch cursor1 into variable;
if not error then
[HACER ALGO]
end if;
until error end repeat;

2 comentaris :

  1. Ejemplo típico de cursor:

    BEGIN
    DECLARE variable TIPOVARIABLE;
    DECLARE error INT DEFAULT 0;
    DECLARE cursor1 cursor for SELECT X FROM Y;
    DECLARE CONTINUE handler for sqlstate '02000' set error = 1;

    open cursor1;

    repeat
    fetch cursor1 into variable;
    if not error then
    [HACER ALGO]
    end if;
    until error end repeat;

    ResponElimina