Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
%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.
DECLARE CURSOR C1 IS SELECT nombre from futbolista WHERE Cod='e1'; Vnom VARCHAR2(15); BEGIN OPEN C1; LOOP FETCH C1 INTO Vnom;
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;