Adiós a los cursores, o no!! (BULK COLLECT ORACLE)

Oracle, pionero en BD relacionales.

Adiós a los cursores, o no!! (BULK COLLECT ORACLE)

Notapor Pere » Mar Nov 16, 2010 4:39 pm

En este caso voy a exponer como cargar en una estructura dinámica ( o como en Oracle las llaman: en una colección), los registros que devuelve una consulta sin necesidad de usar cursores, que es como antiguamente se debía abordar este recurso puesto que no había alternativa.

La función que permite realizar esto sin cursores es BULK COLLECT, por contra no podremos manipular, que yo sepa, el índice de la estructura dinámica, es decir, no tenemos control sobre él. El índice estará formado por números naturales.

Supongamos para ilustrar este recurso que en nuestra BD Oracle tenemos una tabla llamada PROVINCIAS con un diseño de dos campos: ID_PRO y PROVINCIA, donde en el primer campo se guarda el identificador y en el segundo el nombre de la provincia.


Código: Seleccionar todo

DECLARE   
   
   TYPE provincia_TYPE IS TABLE OF provincias
%ROWTYPE;    
   
   itab provincia_TYPE
;   
   
   BEGIN   
      
-- Cargamos los registros en la colección itab con ayuda de BULK COLLECT
      SELECT 
*
      BULK COLLECT INTO itab
      FROM provincias
      WHERE rownum 
< 10;
      
      
-- Iteremos sobre la colección itab para mostrar su contenido
      FOR i IN itab
.FIRST .. itab.LAST LOOP     
         dbms_output
.put_line(itab(i).id_pro || ', ' || itab(i).provincia);         
      END LOOP
;
 END;
 


El resultado que muestra el contenido de la estructura dinámica es el siguiente:

Código: Seleccionar todo

1
, Alava
2
, Albacete
3
, Alicante
4
, Almeria
5
, Avila
6
, Badajoz
7
, Baleares
8
, Barcelona
9
, Burgos


Veamos ahora como hacer esto mismo pero usando SQL dinámico:

Código: Seleccionar todo

DECLARE   
   
   TYPE provincias_TYPE IS TABLE OF provincias
%ROWTYPE;    
   
   itab provincias_TYPE
;   
   v_sql varchar2
(256);
   
   BEGIN   
      v_sql 
:= '
      SELECT *      
      FROM provincias
      WHERE rownum < 10'
;
      
      execute immediate v_sql BULK COLLECT INTO itab
;
        
      FOR i IN itab
.FIRST .. itab.LAST LOOP     
         dbms_output
.put_line(itab(i).id_pro || ', ' || itab(i).provincia);   
      END LOOP
;
 END;
 


Y esto es todo en este post, espero podáis aplicarlo...
Pere
 
Mensajes: 74
Registrado: Mar Feb 02, 2010 9:44 pm

Volver a SGBD Oracle

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 18 invitados