Continuamos con los cursores de PL/SQL, esta vez vamos a ver variables de acoplamiento y cursores con parámetros.
Variables de acoplamiento
Si os fijáis en el siguiente ejemplo veréis que en la cláusula where se incluye una variable que se deberá declarar previamente. Este tipo de variables recibe el nombre de variables de acoplamiento. El programa la sustituirá por su valor en el momento en que se abre el cursor, y se seleccionarán las filas según dicho valor.
Create or replace procedure ver_jugador(codeq varchar2)
IS
vequi varchar2(3);
cursor c1 is select nombre from jugador where cod=vequi;
vnom varchar2(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;
Cursor FOR . LOOP
El trabajo normal de un cursor consiste en declarar un cursor, declarar una variable que recogerá los datos del cursor, abrir el cursor, recuperar con fetch, una a una, las filas extraídas introduciendo los datos en las variables, procesándolos y comprobando si se han recuperado datos o no.Para resumir todas esas tareas, tenemos una estructura cursor FOR...LOOP que hace todas estas cosas de forma implícita, todas menos la declaración del cursor.
El formato y el uso de esta estructura es:
- se declara la información cursor en la sección correspondiente
- Se presenta el cursor utilizando el siguiente formato: FOR nombreVarReg IN nombreCursor
LOOP . END LOOP;
Al entrar en el bucle se abre el cursor de manera automática, se declara implícitamente la variable nombreVarReg de tipo nombrecursor%ROWTYPE y se ejecuta el primer fetch cuyo resultado quedarán en nombreVarReg. A continuación se realizaran las acciones que correspondas hasta llegar al END LOOP.
Este es un ejemplo del LOOP . END LOOP:
DECLARE
cursor c2 is select nombre, peso, estatura from jugador where salario>1200;
BEGIN
FOR vreg IN c2 LOOP
DBMS_OUTPUT.PUT_LINE (vreg.nombre || '-' ||vreg.peso || '-' || vreg.estatura);
END LOOP;
END;
Cursores con parámetros
Un cursor puede tener parámetros; en este caso se aplicara el siguiente formato genérico:CURSOR nombrecursor [(parámetros)] IS SELECT <sentencia select en la que intervendrán los parámetros>;
Los parámetros formales indicados después del nombre del cursor tienen la siguiente sintaxis:
nombreCursor [IN] tipodato [{:=|DEFAULT} valor]
Todos los parámetros formales de un cursor son parámetros de entrada y su ámbito es local al cursor por eso sólo pueden ser referenciados dentro de la consulta.
Un ejemplo seria el siguiente:
DECLARE
...
CURSOR C1 (vpeso number, vestatura number DEFAULT 170) is select nficha, nombre FROM emple WHERE estatura=vestatura AND peso=vpeso;
Para abrir un cursor con parámetros lo haremos de la siguiente forma:
OPEN nombrecursor [(parámetros)];