sql >> Base de Datos >  >> RDS >> Oracle

Propósito de usar diferentes tipos de colecciones PL/SQL en Oracle

Comencemos con las tablas anidadas, son la forma de recopilación más común y, por lo tanto, representan una base útil de comparación.

Una tabla anidada es una variable que puede contener más de una instancia de algo, a menudo un registro de una tabla de base de datos. Podrían declararse así:

type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;

Son útiles cuando queremos almacenar varias instancias de datos contra las que queremos hacer lo mismo. El ejemplo clásico es usar BULK COLLECT para almacenar múltiples registros:

select * 
bulk collect into emp_rec_nt
from employees;

Esto nos da una fuente de datos que podemos recorrer; De manera crucial, podemos navegar tanto hacia atrás como hacia adelante, incluso saltar al final o al principio, que son cosas que no podemos hacer con un cursor. Las tablas anidadas pueden ser colecciones de cualquier tipo de datos, incluidos compuestos como registros PL/SQL o tipos definidos por el usuario.

Una tabla Index By se llama mejor (como lo hacen los documentos) una matriz asociativa. Estas son colecciones simples de atributos únicos con un índice. Las tablas anidadas también tienen índices, pero sus índices son solo recuentos de filas. Con una matriz asociativa, el índice puede ser significativo, es decir, puede obtenerse de un valor de datos. Por lo tanto, son útiles para almacenar en caché valores de datos para su uso posterior. El índice puede ser un número o (desde 9iR2) una cadena que puede ser muy útil. Por ejemplo, aquí hay una matriz asociativa de salarios indexada por el identificador de empleado.

type emp_sal_aa is table of emp.sql%type
     index by emp.empno%type;
l_emp_sales emp_sal_aa;

Tenga en cuenta que podría haber declarado esa matriz usando INDEX BY BINARY_INTEGER pero es más claro usar la sintaxis %TYPE en su lugar (código autodocumentado). Los elementos de esa matriz pueden identificarse mediante un valor de índice, en este caso EMPNO:

l_emp_sals(l_emp_no) := l_emp_sal;

Aparte del almacenamiento en caché de tablas de referencia o valores de búsqueda similares, no hay muchos casos de uso para matrices asociativas.

Las matrices de variables son solo tablas anidadas con un límite predefinido en la cantidad de elementos. Entonces, quizás el nombre sea engañoso:en realidad son matrices fijas. Hay poco que podamos hacer con VArrays que no podamos hacer con tablas anidadas (excepto restringir la cantidad de elementos y es bastante raro que queramos hacer eso). Se declaran así:

type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;

Podemos usar recolección masiva para llenar un VArray...

select * 
bulk collect into emp_rec_va
from employees;

Sin embargo, debemos estar seguros de que la consulta devolverá como máximo el número de elementos especificados en la declaración de VArray. De lo contrario, SELECT lanzará ORA-22165.

No hay casos de uso conocidos para matrices de variables. De acuerdo, eso es un poco duro, pero casi todo el tiempo usará tablas anidadas en su lugar. La gran ventaja de los VArrays sobre las tablas anidadas es que garantizan el orden de los elementos. Entonces, si debe sacar los elementos en el mismo orden en que los insertó, use un VArray.

La documentación de PL/SQL dedica un capítulo completo a las colecciones. Obtenga más información.