You are on page 1of 20

Afinamiento SQL y PL/SQL para Desarrolladores

PL/SQL Collections
Lo que aprenderemos en éste capítulo

q Repaso de funcionalidad básica de Collections


q Index by strings
q Collections de Collections (Table Functions)

2
Collections

q Grupo ordenado de elementos , todos del mismo tipo


q Las collections son de una sola dimensión, pero se puede
emular estructuras multidimensionales.
q A partir de una collection se pueden construir colas, pilas,
listas, conjuntos y vectores.

aa bb cc dd ee ff gg hh ii jj kk

1 2 3 4 5 6 7 8 9 10 11

3
Collections - Utilidad

q Para manipular listas de información de manera eficiente


(mucho más rápido que SQL)

q Entregar conjuntos complejos de información a ambientes no


PL/SQL mediante table functions.

q Para mejorar tiempos de ejecución de consultas y DMLs


usando BULK COLLECT y FORALL

4
Collections
TRES TIPOS DE COLLECTIONS

q Associative arrays (index-by tables)


–  Solo pueden usarse en bloques PL/SQL
–  Similares a hash tables en otros lenguajes, permite accesar
elementos mediate valores arbitrarios de subscript.
q Nested tables y varrays
–  También pueden usarse en columnas de tablas relacionales
–  Parte del modelo de objetos de PL/SQL
–  Requerido para table functions
–  Con Varrays se especifica un maximo numero de elementos al
momento de la definicion.
5
Collections -ASSOCIATIVE ARRAYS

q Son prácticamente ilimitados.


–  Pueden indexarse con strings o números enteros.
–  En otros lenguajes de programación se conocen como
Hash Tables.
q Dispersos
–  Los datos no tienen que almacenarse en forma
consecutiva

6
Collections - ASSOCIATIVE ARRAYS

7
Collections - NESTED TABLES

q S imilares a los associative arrays, pero pueden


almacenarse en columnas de una tabla.

q Parte del modelo de objetos, requiere inicialización.


–  Siempre son densas al comienzo, pero puede volverse
'sparse' después de los deletes.
–  Pueden definirse a nivel de tipos en el esquema y
usarse como columnas de una tabla.

8
Collections - NESTED TABLES

Requiere
inicialización

9
Collections - NESTED TABLES

Pueden almacenarse como


columnas en una tabla

10
Collections - VARRAYS

q Tienen un tamaño máximo, definido en el momento en que


se declara

q Parte del modelo de objetos, requiere inicialización


–  Siempre es denso, solo pueden borrarse elementos al
final del varray.
–  Puede definirse como tipo a nivel de esquema y usarse
como tipo de columna en una tabla

11
Collections - VARRAYS

12
Cómo escoger el tipo de Collection ?
q Use associative arrays cuando se necesite....
–  Trabajar sólo con código PL/SQL
–  Llenar de manera dispersa una collection
–  Usar índices negativos o strings
q Use tablas anidadas cuando se necesite....
–  Manipular la collection desde SQL (table functions, columnas en
tablas)
–  Realizar operaciones de conjunto de alto nivel.
q Use varrays cuando se necesite....
–  Especificar un tamaño máximo para su collection
–  Manipular la collection desde SQL (table functions, columnas en
tablas)
13
Métodos para Collections

•  Información sobre la Collection


–  COUNT retorna cantidad de filas que hay en la colección.
–  EXISTS retorna TRUE si la fila especificada está definida
–  FIRST/LAST
–  NEXT/PRIOR
–  LIMIT máximos elementos permitidos en un VARRAY
•  Modificar el contenido de la collection
–  DELETE borra una o más filas de una index-by table
–  EXTEND adiciona filas a una nested table o Varray
–  TRIM elimina filas de un VARRAY

14
Collections - Consideraciones
q La memoria para las collections sale de la PGA o UGA.
–  Cada sesión tiene su propia área de memoria, así que
un programa que use collections puede consumir
grandes cantidades de memoria
q Usar hint de NOCOPY para reducir overhead por paso de
parámetros.
q Si se trata de leer una fila que no existe, Oracle levanta
NO_DATA_FOUND.

15
Collections – Table Functions
CREATE OR REPLACE TYPE lista_telefonos_t IS TABLE OF VARCHAR2
(100);
/
CREATE OR REPLACE FUNCTION mis_telefonos
RETURN lista_telefonos_t
IS
directorio lista_telefonos_t:=lista_telefonos_t();
BEGIN
directorio.EXTEND (4);
directorio (1) := '2666777';
directorio (2) := '0976119995';
directorio (3) := '2333000';
directorio (4) := '1800678678';
return directorio;
END;
16
Collections – Table Functions
q Una Table function es una función que usted puede llamar
desde el FROM de un query, y tratarla como si fuera un query
relacional.
q Permiten realizar transformaciones complejas sobre los
datos y después entregar los datos a través de un query.
q Combinados con REF CURSORS, ahora usted puede
transferir datos fácilmente a otros ambientes (por ejemplo,
Java)

17
Collections – Table Functions

q Una Table Function debe retornar una nested table o varray


que esten basados en tipos definidos en el esquema, o en un
package.
q El encabezado de la función debe ser compatible con SQL ,
todos los parámetros deben usar tipos SQL, sin notación
nombrada.

18
Arreglos multidimensionales
DECLARE
TYPE tipo_tab1 IS TABLE OF VARCHAR2(20); -- nested table de cadenas
var_tab1 tipo_tab1 := tipo_tab1('pl/sql', 'tuning','dba1');
var_tab2 tipo_tab1 := tipo_tab1('java', 'itil','oca');

TYPE tipo_tab2 IS TABLE OF tipo_tab1; -- nested table de una nested table de cadenas
var_tabm tipo_tab2 := tipo_tab2();

var_tab3 tipo_tab1 := tipo_tab1();

BEGIN
var_tabm.extend(2);
var_tabm(1):=var_tab1;
var_tabm(2):=var_tab2;
for i in var_tabm.first ..var_tabm.last loop
dbms_output.put_line('Elemento '||i||' de la tabla multidimensional');
var_tab3:=var_tabm(i);
for j in var_tab3.first ..var_tab3.last loop
dbms_output.put(var_tab3(j)||',');
end loop;
dbms_output.put_line('-----------------------');
end loop;
END;
/ 19
Lo que aprendimos en éste
capítulo

q Repaso de funcionalidad básica de Collections


q Associative Arrays, Nested Tables y Varrays
q Table Functions
q Arreglos multidimensionales

20

You might also like