lunes, 8 de octubre de 2007

Cursores PL/SQL notación FOR...LOOP

La selección mas simple de múltiples filas de una tabla se define mediante la notación FOR...LOOP...END LOOP.
El primer paso que mostramos es la creación de un procedimiento almacenado o stored procedure de nombre FOR_LOOP. La variable Registro es automática, sólo existe dentro del alcance del FOR...LOOP...END LOOP. No puede ser referenciada fuera del mismo. Los miembros o campos de la variable Registro están definidos por las columnas detalladas en la lista de la sentencia SELECT asociada al cursor (OWNER y VIEW_NAME).
SQL> create or replace
2 PROCEDURE FOR_LOOP
3 IS
4 BEGIN
5 FOR Registro IN (SELECT OWNER, VIEW_NAME
6 FROM ALL_VIEWS
7 WHERE OWNER = 'SYS'
8 AND VIEW_NAME LIKE 'ALL_TAB%')
9 LOOP
10 DBMS_OUTPUT.PUT_LINE('ESQUEMA: ' ||
11 Registro.OWNER ||
12 ' VISTA: ' ||
13 Registro.VIEW_NAME);
14 END LOOP;
15 END FOR_LOOP;
16 /

Procedimiento creado.
Luego verificamos si el procedimiento fue efectivamente creado con el comando DESCRIBE.
SQL> DESCRIBE FOR_LOOP
PROCEDURE FOR_LOOP
Una vez confirmada su existencia habilitamos la salida de mensajes en pantalla y ejecutamos el procedimiento con el comando EXECUTE.
SQL> SET SERVEROUTPUT ON

SQL> EXECUTE FOR_LOOP;
ESQUEMA: SYS VISTA: ALL_TABLES
ESQUEMA: SYS VISTA: ALL_TAB_COLS
ESQUEMA: SYS VISTA: ALL_TAB_COLUMNS
ESQUEMA: SYS VISTA: ALL_TAB_COL_STATISTICS
ESQUEMA: SYS VISTA: ALL_TAB_COMMENTS
ESQUEMA: SYS VISTA: ALL_TAB_HISTOGRAMS
ESQUEMA: SYS VISTA: ALL_TAB_MODIFICATIONS
ESQUEMA: SYS VISTA: ALL_TAB_PARTITIONS
ESQUEMA: SYS VISTA: ALL_TAB_PRIVS
ESQUEMA: SYS VISTA: ALL_TAB_PRIVS_MADE
ESQUEMA: SYS VISTA: ALL_TAB_PRIVS_RECD
ESQUEMA: SYS VISTA: ALL_TAB_STATISTICS
ESQUEMA: SYS VISTA: ALL_TAB_STATS_HISTORY
ESQUEMA: SYS VISTA: ALL_TAB_SUBPARTITIONS

Procedimiento PL/SQL terminado correctamente.

SQL>
Esta forma de recupero de filas es la mas simple pero la menos flexible de las notaciones de PL/SQL para cursores. Inmediatamente después de definida la sentencia SELECT implementamos el ciclo de procesamiento de las filas recuperadas. Esta proximidad nos facilita la lectura del código fuente pero nos reduce las opciones.

También podemos leer este tema en la documentación estandar de Oracle:

Manual: Oracle Database PL/SQL User's Guide and Reference
Capítulo: 6 Performing SQL Operations from PL/SQL
Título: Querying Data with PL/SQL
Subtítulo: Querying Data with PL/SQL: Implicit Cursor FOR Loop

Entradas relacionadas:
PL/SQL Tutorial
Cursores PL/SQL notación SELECT..INTO
Cursores PL/SQL notación FOR...LOOP
Cursores PL/SQL notación CURSOR...FOR...LOOP
Cursores PL/SQL notación OPEN...FETCH...CLOSE
Cursores PL/SQL notación FETCH...BULK COLLECT INTO...