Está en la página 1de 3

Comenzamos a explicar los cursores de PL/SQL. Veremos los cursores explcitos, sus atributos y las variables de acoplamiento .

Por Sara Alvarez


Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

En los anteriores captulos hemos visto los fundamentos del lenguaje PL/SQL, bien pues, a partir de ahora pasaremos a estudiar el manejo de este lenguaje para trabar con el gestor de Oracle. Empezaremos con la utilizacin de cursores. Hasta ahora hemos utilizado cursores implcitos, cuando devolvamos el resultado de una select mediante la clausula into a una variable. Pero esto es un problema cuando el resultado de una subconsulta nos devolva varias filas, porque esto nos daria un error al ejecutar la consulta Para que no nos salte un error en estos casos debemos utilizar los cursores explcitos.

Cursores explcitos
Los cursores explcitos los utilizamos cuando tenemos consultas que nos devuelven ms de una fila. Tenemos 4 operaciones bsicas para trabajar con un cursor explcito.

1. 2.

Declaracin del cursor: lo tenemos que declarar en la zona de declaraciones, con el siguiente formato: CURSOR <nombrecursor> IS <sentencia SELECT>; Apertura del cursor: Deber colocarse en la zona de instrucciones, con el siguiente formato:
OPEN <nombrecursor>;

Al hacerlo se ejecuta automticamente la sentencia select y sus resultados se almacenan en las estructuras internas de memoria manejadas por el cursor.

3.

Recogida de informacin: 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.

- Cierre del cursor:


CLOSE <nombrecursor>;

Ahora, veamos un ejemplo de utilizacin de cursores explcitos:

DECLARE CURSOR C1 IS SELECT nombre, apellido FROM arbitro; Vnom VARCHAR2(12); Vape BEGIN OPEN C1; LOOP FETCH C1 INTO Vnom, Vape; EXIT WHEN C1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(Vnom || '' || Vapen); END LOOP; CLOSE C1; END; VARCHAR2(20);

Si nos fijamos, en la declaracin de los cursores explcitos no utilizamos la clusula INTO, que s se utilizaba en los cursores implcitos. Ademas podis ver que despus del FETCH hemos comprobado si nos devuelve valores con la linea del EXIT. Es algo importante ya que si no nos devuelve nada el LOOP se interrumpir.

Atributos del cursor


Para conocer detalles de la situacin del cursor tenemos 4 atributos:

%FOUND: devuelve verdadero di el ultimo FETCH ha recuperado algn valor; en caso contrario devuelve falso; si el cursor no esta abierto nos devuelve error. %NOTFOUND: hace justamente lo contrario al anterior. %ROWCOUNT: nos devuelve el nmero de filas recuperadas hasta el momento. %ISOPEN: devuelve verdadero si el cursor esta abierto.

Veamos ahora un ejemplo de utilizacin de %ROWCOUNT:

DECLARE CURSOR C1 IS SELECT nombre from futbolista WHERE Cod='e1'; Vnom VARCHAR2(15); BEGIN OPEN C1; LOOP FETCH C1 INTO Vnom;

EXIT WHEN C1%NOTFOUND; DBMS_OUTPUT.PUT_LINE (C1%ROWCOUNT || Vnom);

END LOOP; CLOSE C1; END;

Variables de acoplamientos en el manejo de cursores


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 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 futbolistas de un equipo cualquiera.

CREATE OR REPLACE PROCEDURE ver_futbolistas_por_equipos(codeq VARCHAR2) IS Vequi VARCHAR2(3); CURSOR C1 IS SELECT nombre from futbolista where codeq=Vequi; Vnom VARCHAR(15); BEGIN vequi:=codeq; OPEN C1; FETCH C1 INTO vnom; WHILE C1%FOUND LOOP DBMS_OUTPUT.PUT_LINE(Vnom); FETCH C1 INTO Vnom; END LOOP; CLOSE C1; END;

También podría gustarte