Adiós a los cursores, o no!! (BULK COLLECT ORACLE)
![Nota Nota](./styles/prosilver/imageset/icon_post_target.gif)
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.
El resultado que muestra el contenido de la estructura dinámica es el siguiente:
Veamos ahora como hacer esto mismo pero usando SQL dinámico:
Y esto es todo en este post, espero podáis aplicarlo...
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...