www.devjoker.com

BULK COLLECT

    PL/SQL nos permite leer varios registros en una tabla de PL con un único acceso a través de la instrucción BULK COLLECT.

    Esto nos permitirá reducir el número de accesos a disco, por lo que optimizaremos el rendimiento de nuestras aplicaciones. Como contrapartida el consumo de memoria será mayor.


 DECLARE
   TYPE t_descripcion IS TABLE OF PAISES.DESCRIPCION%TYPE;
   TYPE t_continente  IS TABLE OF PAISES.CONTINENTE%TYPE;
   v_descripcion t_descripcion;
   v_continente  t_continente;
  
 BEGIN
   SELECT DESCRIPCION,
    CONTINENTE
   BULK COLLECT INTO v_descripcion, v_continente
   FROM PAISES;
   FOR i IN v_descripcion.FIRST .. v_descripcion.LAST LOOP
     dbms_output.put_line(v_descripcion(i) || ', ' || v_continente(i));
   END LOOP;
 END;
 /

    Podemos utilizar BULK COLLECT con registros de PL.


 DECLARE
   TYPE PAIS IS RECORD (CO_PAIS     NUMBER  ,
         DESCRIPCION VARCHAR2(50),
         CONTINENTE  VARCHAR2(20));
   TYPE t_paises IS TABLE OF PAIS;
   v_paises t_paises;
 BEGIN
   SELECT  CO_PAIS, DESCRIPCION, CONTINENTE
   BULK COLLECT INTO v_paises
   FROM PAISES;
 
   FOR i IN v_paises.FIRST .. v_paises.LAST LOOP
     dbms_output.put_line(v_paises(i).DESCRIPCION ||
', ' || v_paises(i).CONTINENTE);
   END LOOP;
 END;
 /

    Tambien podemos utilizar el atributo ROWTYPE.


 DECLARE
 
   TYPE t_paises IS TABLE OF PAISES%ROWTYPE;
   v_paises t_paises;
 BEGIN
   SELECT  CO_PAIS, DESCRIPCION, CONTINENTE
   BULK COLLECT INTO v_paises
   FROM PAISES;
 
   FOR i IN v_paises.FIRST .. v_paises.LAST LOOP
     dbms_output.put_line(v_paises(i).DESCRIPCION ||
', ' || v_paises(i).CONTINENTE);
   END LOOP;
 END;
 /