sábado, 10 de agosto de 2013

CURSOR

CURSOR

Los cursores se utilizan para manejar las sentencias SELECT. Un cursor está formado por un conjunto de registros devueltos por una instrucción SQL del tipo SELECT. Desde un punto de visto interno a la base de datos, los cursores son segmentos de memoria utilizados para realizar operaciones con los registros devueltos tras ejecutar una sentencia SELECT.

TIPOS DE CURSORES

Reciben el nombre de cursores implícitos, cuando la sentencia SELECT regresa solo un registro.

Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicítos combinados con un estructura de bloque.

Un cursor admite el uso de parámetros. Los parámetros deben declararse junto con el cursor.
El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor.



Fases de un cursor

CURSORES



Los cursores permiten realizar operaciones sobre los registros devueltos por una sentencia Select. La utilización de cursores es necesaria cuando:

Se necesita tratamiento fila a fila
– En sentencias SELECT que devuelven más de una fila
• Operaciones con cursores
– Declare
• Se declara el cursor asignándole nombre y asociándole a una consulta.
– Open
• Abre el cursor y lo inicializa para que devuelva las filas.
• Ejecuta la consulta asociada al cursor.
– Fetch
• Lee los datos del cursor con la sentencia FETCH.
• Devuelve la siguiente fila en el conjunto activo.
• Los datos devueltos se almacenan en variables de control o en un
registro. FETCH ... INTO ...
– Close
• Desactiva el cursor y libera los recursos. CLOSE cursor_1;

Ejemplo uso de cursor

DECLARE
CURSOR cursor_1 IS
SELECT nombre, número, salario
FROM emp ORDER BY salario;
w_nombre emp.nombre%TYPE;
w_número emp.número%TYPE;
w_salar io emp.salario%TYPE;
BEGIN
OPEN cursor_1;
FETCH cursor_1 INTO w_nombre, w_número, w_salario;
...
CLOSE cursor_1;
END;

Atributos del cursor

– Cada cursor definido tiene cuatro atributos a los que se
puede acceder para conocer el estado del cursor.
• %FOUND Devuelve true si el último FETCH evaluado
devuelve la siguiente fila.
• %NOTFOUND Devuelve true si el último FETCH evaluado
no devuelve ninguna fila.
• %ROWCOUNTContador inicialmente a cero, que se
incrementa en uno tras el FETCH de cada fila.
• %ISOPEN Devuelve true si el cursor especificado está
abierto

Ejemplo uso de atributos del cursor

DECLARE
CURSOR cursor_1 IS
SELECT nombre, salario FROM empleados;
registro cursor_1%ROWTYPE
BEGIN
IF NOT (cursor_1%ISOPEN) THEN OPEN cursor_1;
ENDIF;
LOOP
FETCH cursor_1 INTO registro;
EXIT WHEN cursor_1%NOTFOUND;
...
END LOOP;
CLOSE cursor_1;
END;

Cursores implícitos

Se utilizan cuando la sentencia SELECT devuelve un solo registro. En cada cursor implicito debe existir palabra reservada INTO.



Las variables que reciben los datos devueltos por el cursor tienen que contienen el mismo tipo de dato que las columnas de la tabla.


MySQL no soporta esta clase de cursores pero podemos visualizarlos así.


Importante poner un delimitador nuevo, (suele ser ";") ya que si no se cambia toma el punto y coma como delimitador, es decir que sería el final del procedimiento o función (Línea 2).


El comando DECLARE (línea 5) sirve para declarar variables locales y cursores. Solo funcionan dentro de procedimientos inmediatamente del BEGIN.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DROP PROCEDURE IF EXISTS precioDolar;
DELIMITER $$;
CREATE PROCEDURE precioDolar(
  OUT fechas       DATE,
  OUT precioActual DECIMAL(8,4)
)
BEGIN
 DECLARE c CURSOR
 FOR SELECT fecha, precio
       FROM dolar
       WHERE fecha = (SELECT MAX(fecha) FROM dolar);
 SET precioActual = 0;
 OPEN c;
   FETCH c INTO fechas, precioActual;
 CLOSE c;  
END$$
DELIMITER ;
CALL precioDolar(@fecha,@precio);
SELECT @fecha, @precio;

  


1
2
3
4
5
6
7
8
DECLARE
fechas         dolar.fecha%TYPE ;
precioActual   dolar.precio%TYPE;
BEGIN
SELECT fecha, precio INTO fechas, precioActual
FROM dolar WHERE fecha = (SELECT MAX(fecha) FROM dolar);
dbms_output.put_line(fechas || ' ' || precioActual);
END;




1 comentario:

  1. Casinos in Fort Myers, FL - Mapyro
    Get 인천광역 출장샵 directions, 정읍 출장마사지 reviews and 동해 출장안마 information for Casinos in Fort Myers, FL. Casinos with 1,087 gaming 제주도 출장안마 machines, 안동 출장안마 33 table games and 107 live entertainment venues.

    ResponderEliminar