Oracle permite acceder a los valores de colecciones PL/SQL desde sentencias SQL. Esta propiedad del comando SELECT se llama table_collection_expression y muestra el contenido de una colección como si de una tabla se tratara.
Para que el proceso funcione correctamente es necesario que la colección esté declarada en el esquema, no dentro de un paquete:
-- Create PL/SQL collection
create or replace type ty_number is table of number;
-- Select from one PL/SQL collection
select * from table(ty_number(10,20,30,50,40));
La sentencia daría como resultado:
COLUMN_VALUE
------------
10
20
30
50
40
Esta propiedad puede resultarnos muy útil cuando estamos programando en PL/SQL y, por ejemplo, necesitamos extraer datos de una consulta a través de un proceso bulk collection y compararlos con registros de otras tablas.
Pero, ¿qué ocurre si necesitamos cruzar datos de dos colecciones PL/SQL y datos de tablas? ¿Cómo vamos a correlacionar los elementos de varias colecciones entre sí? En estos casos podemos recurrir a una sentencia join en combinación con la cláusula connect by level para generar los índices que nos permitirán recorrer las colecciones:
-- Select from two correlated PL/SQL collections
select coll_index, coll_1_value, coll_2_value
from (select level coll_index from dual connect by level <= 5) gen_idx -- Generate index for iterate collections
join (select rownum rn, column_value coll_1_value from table(ty_number(10,20,30,50,40))) coll_1 on gen_idx.coll_index = coll_1.rn -- Collection 1
join (select rownum rn, column_value coll_2_value from table(ty_number(11,21,31,51,41))) coll_2 on gen_idx.coll_index = coll_2.rn; -- Collection 2
La ejecución de la sentencia produce el siguiente resultado:
COLL_INDEX COLL_1_VALUE COLL_2_VALUE
---------- ------------ ------------
1 10 11
2 20 21
3 30 31
4 50 51
5 40 41
Como puede apreciarse al fijarnos en las filas 4 y 5, los elementos de las colecciones mantienen el orden original y la correlación entre sus elementos.
Me gusta esto:
Me gusta Cargando...