Declaración de cursores explícitos.
1. Declaración del cursor: lo tenemos que declarar en
la zona de declaraciones, con el siguiente formato: CURSOR <nombrecursor> IS <sentencia SELECT>;
2. Apertura del cursor: Deberá colocarse en la zona de
instrucciones, con el siguiente formato: OPEN
<nombrecursor>;
Al hacerlo se ejecuta automáticamente la sentencia select y sus resultados se almacenan en las estructuras internas de memoria manejadas por el cursor.
Al hacerlo se ejecuta automáticamente la sentencia select y sus resultados se almacenan en las estructuras internas de memoria manejadas por el cursor.
3. Recogida de información: Para recuperar la
información 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 cláusula select, por lo que serán del mismo tipo que las columnas.
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 cláusula select, por lo que serán del mismo tipo que las columnas.
4. - Cierre del cursor: CLOSE
<nombrecursor>;
OPEN nombre_cursor;
LOOP
FETCH nombre_cursor INTO lista_variables;
EXIT WHEN nombre_cursor%NOTFOUND;
/*
Procesamiento de los registros recuperados */
END LOOP;
CLOSE nombre_cursor;
Atributos del cursor
Detalles de la situación del cursor tenemos 4 atributos:
- %FOUND: devuelve
verdadero di el último FETCH ha recuperado algún valor; en caso contrario
devuelve falso; si el cursor no está abierto nos devuelve error.
- %NOTFOUND: hace justamente
lo contrario al anterior.
- %ROWCOUNT: nos devuelve el
número de filas recuperadas hasta el momento.
- %ISOPEN: devuelve
verdadero si el cursor está abierto.
Manejo del cursor
Bucle LOOP con una sentencia EXIT condicionada
DECLARE
cursor CursorLoop IS SELECT employee_id,first_name,email
FROM employees;
vid employees.employee_id%TYPE;
vfirst_name
employees.first_name%TYPE;
vemail employees.email%TYPE;
BEGIN
OPEN CursorLoop;
LOOP
FETCH CursorLoop INTO
vid,vfirst_name,vemail;
EXIT WHEN CursorLoop %NOTFOUND;
dbms_output.put_line('Id:
'||vid||' |Nombre: '||vfirst_name||' |Email:'||vemail);
END LOOP;
CLOSE CursorLoop;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error: '||SQLERRM);
END;
Bucle WHILE LOOP
DECLARE
cursor
CursorWhile IS SELECT employee_id,first_name,email FROM employees;
vid
employees.employee_id%TYPE;
vfirst_name employees.first_name%TYPE;
vemail
employees.email%TYPE;
BEGIN
OPEN
CursorWhile;
FETCH
CursorWhile INTO vid,vfirst_name,vemail;
WHILE
CursorWhile%FOUND
LOOP
dbms_output.put_line('Id: '||vid||' |Nombre: '||vfirst_name||'
|Email:'||vemail);
FETCH CursorWhile INTO vid,vfirst_name,vemail;
END
LOOP;
CLOSE
CursorWhile;
EXCEPTION
WHEN
OTHERS THEN
dbms_output.put_line('Error: '||SQLERRM);
END;
Bucle FOR LOOP
DECLARE
cursor CursorFor IS SELECT employee_id,first_name,email FROM employees;
BEGIN
FOR employee_rec IN CursorFor
LOOP
dbms_output.put_line('Id: '||employee_rec.employee_id||' |Nombre:
'||employee_rec.first_name||' |Email: '||employee_rec.email);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error: '||SQLERRM);
END;
No hay comentarios:
Publicar un comentario