Вы находитесь на странице: 1из 6

UNIVERSIDAD DEL CAUCA FACULTAD DE INGENIERA ELECTRNICA Y TELECOMUNICACIONES PROGRAMA DE INGENIERA DE SISTEMAS LAB. BASES DE DATOS II ING.

. MARITZA MERA GAONA Cursores Un cursor es el nombre para un rea memoria privada que contiene informacin procedente de la ejecucin de una sentencia SELECT. Cada cursor tiene unos atributos que nos devuelven informacin til sobre el estado del cursor en la ejecucin de la sentencia SQL. Cuando un cursor est abierto y los datos referenciados por la consulta SELECT cambian, estos cambios no son recogidos por el cursor. Tcnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT. Cursores implcitos. Este tipo de cursores se utiliza para operaciones SELECT INTO. Se usan cuando la consulta devuelve un nico registro. Los cursores implcitos se utilizan para realizar consultas SELECT que devuelven un nico registro. Deben tenerse en cuenta los siguientes puntos cuando se utilizan cursores implcitos:

Los cursores implcitos no deben ser declarados Con cada cursor implcito debe existir la palabra clave INTO. Las variables que reciben los datos devueltos por el cursor tienen que contener el mismo tipo de dato que las columnas de la tabla. Los cursores implcitos solo pueden devolver una nica fila. En caso de que se devuelva ms de una fila (o ninguna fila) se producir una excepcin. Las ms comunes son:

NO_DATA_FOUND: Se produce cuando una sentencia SELECT intenta recuperar datos pero ninguna fila satisface sus condiciones. Es decir, cuando no hay datos TOO_MANY_ROWS Dado que cada cursor implcito slo es capaz de recuperar una fila, esta excepcin detecta la existencia de ms de una fila. Ejemplo:
SET SERVEROUTPUT ON; declare vdescripcion VARCHAR2(50); begin SELECT pai_id INTO vdescripcion from PAIS WHERE pai_nombre = 'Colombia'; dbms_output.put_line('La lectura del cursor es: ' || vdescripcion); end;

Cursores explcitos. Son los cursores que son declarados y controlados por el programador. Se utilizan cuando la consulta devuelve un conjunto de registros. Ocasionalmente tambin se utilizan en consultas que devuelven un nico registro por razones de eficiencia. Son ms rpidos.

UNIVERSIDAD DEL CAUCA FACULTAD DE INGENIERA ELECTRNICA Y TELECOMUNICACIONES PROGRAMA DE INGENIERA DE SISTEMAS LAB. BASES DE DATOS II ING. MARITZA MERA GAONA Nombres de Cursores Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos convenios que cualquier otra variable. Los cursores implcitos no necesitan declaracin. Para procesar instrucciones SELECT que devuelvan ms de una fila, son necesarios cursores explcitos combinados con una estructura de bloque. A partir de ahora, cuando hagamos referencia a cursores nos referiremos a cursores explcitos. Para trabajar con un cursor hay que realizar los siguientes pasos: 1. Declarar el cursor: lo tenemos que declarar en la zona de declaraciones, con el siguiente formato: CURSOR <nombrecursor> IS <sentencia SELECT>; 2. Abrir el cursor en el servidor: Deber colocarse en la zona de instrucciones, con el siguiente formato: OPEN <nombrecursor>; 3. Recuperar cada una de sus filas (bucle): Para recuperar la informacin anteriormente guardada en las estructuras de memoria interna tenemos que usar el siguiente formato: FETCH <nombrecursor> INTO {<variable> | <listavariables>}; Si tenemos una nica variable que recoge los datos de todas las columnas, el formato de la variable seria el siguiente: <variable> <nombrecursor>%ROWTYPE; Si tenemos una lista de variables, cada una recoger la columna correspondiente de la clusula select, por lo que sern del mismo tipo que las columnas. 4. Cerrar el cursor CLOSE <nombrecursor>; Atributos de un Cursor Existen cuatro atributos asociados con los cursores de PL/SQL: %NOTFOUND, %FOUND, %ROWCOUNT, %ISOPEN. El %NOTFOUND devuelve FALSE cuando es extrada una fila, TRUE si el ltimo FETCH no extrajo fila alguna y NULL si el SELECT del cursor no ha retornado datos.

UNIVERSIDAD DEL CAUCA FACULTAD DE INGENIERA ELECTRNICA Y TELECOMUNICACIONES PROGRAMA DE INGENIERA DE SISTEMAS LAB. BASES DE DATOS II ING. MARITZA MERA GAONA El %FOUND es lgicamente opuesto al %FOUND en cuanto al TRUE y FALSE, pero sigue retornando NULL si el cursor no ha retornado datos. El %ROWCOUNT se utiliza para determinar cuntas filas han sido extradas en un punto. Este valor se incrementa con cada fila extrada y tiene valor cero cuando apenas ha sido abierto el cursor. Por ltimo, el %ISOPEN, tiene valores TRUE o FALSE, dependiendo de si el cursor asociado ha sido abierto o no. Ejemplo: Ahora, veamos un ejemplo de utilizacin de cursores explcitos:

set serveroutput on DECLARE CURSOR C1 IS SELECT act_nombre, act_telefono FROM actor; Vnom VARCHAR2(40); Vtel VARCHAR2(30); BEGIN OPEN C1; LOOP FETCH C1 INTO Vnom, Vtel; EXIT WHEN C1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(Vnom || '' || Vtel); END LOOP; CLOSE C1; END;
Si nos fijamos, en la declaracin de los cursores explcitos no utilizamos la clusula INTO, que s se utilizaba en los cursores implcitos. Adems se puede ver que despus del FETCH hemos comprobado si nos devuelve valores con la lnea del EXIT. Es algo importante ya que si no nos devuelve nada el LOOP se interrumpir. Variables de Acoplamiento En el ejemplo siguiente podemos observar que en la clusula WHERE se incluye una variable que se debera haber declarado previamente. Este tipo de variables reciben el nombre de variables de

UNIVERSIDAD DEL CAUCA FACULTAD DE INGENIERA ELECTRNICA Y TELECOMUNICACIONES PROGRAMA DE INGENIERA DE SISTEMAS LAB. BASES DE DATOS II ING. MARITZA MERA GAONA acoplamiento. El programa la sustituir por su valor en el momento en que se abre el cursor, y se seleccionarn las filas segn dicho valor. Aunque ese valor cambie durante la recuperacin de los datos con FETCH, el conjunto de filas que contiene el cursor no variar. El ejemplo nos muestra los actores de un pas recibido como parametro.

CREATE OR REPLACE PROCEDURE ver_actores_por_pais (vnompais VARCHAR2) IS vpais VARCHAR2(30); CURSOR C1 IS SELECT act_nombre from actor NATURAL JOIN pais where pai_nombre=vpais; vnom VARCHAR(40); BEGIN vpais:=vnompais; OPEN C1; FETCH C1 INTO vnom; WHILE C1%FOUND LOOP DBMS_OUTPUT.PUT_LINE(vnom); FETCH C1 INTO vnom; END LOOP; CLOSE C1; END; execute ver_actores_por_pais ('Argentina'); select * from pais natural join actor where pai_nombre='Argentina'; Tambin se pueden emplear registros para recuperar los datos del cursor en el FETCH. El siguiente ejemplo ilustra el trabajo con un cursor explicito. Hay que tener en cuenta que al leer los datos del cursor debemos hacerlo sobre variables del mismo tipo de datos de la tabla (o tablas) que trata el cursor.

UNIVERSIDAD DEL CAUCA FACULTAD DE INGENIERA ELECTRNICA Y TELECOMUNICACIONES PROGRAMA DE INGENIERA DE SISTEMAS LAB. BASES DE DATOS II ING. MARITZA MERA GAONA

set serveroutput on DECLARE CURSOR cpaises IS SELECT PAI_ID, PAI_NOMBRE FROM PAIS; co_pais NUMBER(38); nombre VARCHAR2(30); BEGIN OPEN cpaises; FETCH cpaises INTO co_pais,nombre; WHILE cpaises%FOUND LOOP DBMS_OUTPUT.PUT_LINE(co_pais|| '' || nombre); FETCH cpaises INTO co_pais,nombre; END LOOP; CLOSE cpaises; END;

Podemos simplificar el ejemplo utilizando el atributo de tipo %ROWTYPE sobre el cursor. set serveroutput on DECLARE CURSOR cpaises IS SELECT PAI_ID, PAI_NOMBRE FROM PAIS; registro cpaises%ROWTYPE; BEGIN OPEN cpaises; FETCH cpaises INTO registro; WHILE cpaises%FOUND LOOP

UNIVERSIDAD DEL CAUCA FACULTAD DE INGENIERA ELECTRNICA Y TELECOMUNICACIONES PROGRAMA DE INGENIERA DE SISTEMAS LAB. BASES DE DATOS II ING. MARITZA MERA GAONA

DBMS_OUTPUT.PUT_LINE(registro.pai_id|| '' || registro.pai_nombre); FETCH cpaises INTO registro; END LOOP; CLOSE cpaises; END;
Prctica

Cree procedimientos almacenados para mostrar la siguiente informacin; utilice cursores y registros: 1. Consultar todos los datos de los actores que han participado en pelculas que tienen una categora en particular, la categora debe ser pasada como parmetro a un cursor. 2. Mostrar los datos de las categoras de pelculas por cada categora el nmero de pelculas para aquellas categoras en las que han participado actores de un pas especifico (pasado como parmetro) 3. Muestre todos los datos de los actores que han participado en ms de un numero n de pelculas, el valor n debe ser pasado como parmetro. 4. Mostrar todos los pases de los actores que representa un representante en particular (pasar el id como parmetro) 5. Consultar todas las pelculas que han superado en salario de los actores un presupuesto ledo desde teclado. 6. Mostrar todas las categoras en las que han participado los actores nacidos en x pas, el pas debe ser pasado como parmetro. 7. Mostrar los datos que ms ha ganado por su actuacin en una pelcula en particular, el cdigo de la pelcula debe ser pasado como parmetro.

Вам также может понравиться