Oracle Colecciones PL/SQL: Varrays, anidadas e indexadas por tablas

ยฟQuรฉ es la colecciรณn?

Una colecciรณn es un grupo ordenado de elementos de tipos de datos especรญficos. Puede ser una colecciรณn de tipos de datos simples o complejos (como tipos de datos definidos por el usuario o de registro).

En la colecciรณn, cada elemento estรก identificado por un tรฉrmino llamado "subรญndice." A cada elemento de la colecciรณn se le asigna un subรญndice รบnico. Los datos de esa colecciรณn se pueden manipular o recuperar haciendo referencia a ese subรญndice รบnico.

Las colecciones son cosas muy รบtiles cuando es necesario procesar o manipular una gran cantidad de datos del mismo tipo. Las colecciones se pueden completar y manipular en su totalidad usando la opciรณn 'BULK' en Oracle.

Las colecciones se clasifican segรบn la estructura, el subรญndice y el almacenamiento como se muestra a continuaciรณn.

  • รndice por tablas (tambiรฉn conocido como matriz asociativa)
  • Tablas anidadas
  • Varrays

En cualquier momento, se puede hacer referencia a los datos de la colecciรณn mediante tres tรฉrminos Nombre de colecciรณn, Subรญndice, Nombre de campo/columna como โ€œ().โ€. Aprenderรก mรกs sobre estas categorรญas de colecciones mencionadas anteriormente en la siguiente secciรณn.

Varrays

Varray es un mรฉtodo de recopilaciรณn en el que el tamaรฑo de la matriz es fijo. El tamaรฑo de la matriz no puede superar su valor fijo. El subรญndice de Varray es un valor numรฉrico. A continuaciรณn se muestran los atributos de Varrays.

  • El tamaรฑo del lรญmite superior es fijo
  • Completado secuencialmente comenzando con el subรญndice '1'
  • Este tipo de colecciรณn siempre es densa, es decir, no podemos eliminar ningรบn elemento de la matriz. Varray se puede eliminar en su totalidad o se puede recortar desde el final.
  • Como siempre es de naturaleza densa, tiene muy menos flexibilidad.
  • Es mรกs apropiado usarlo cuando se conoce el tamaรฑo de la matriz y realizar actividades similares en todos los elementos de la matriz.
  • El subรญndice y la secuencia siempre permanecen estables, es decir, el subรญndice y el recuento de la colecciรณn son siempre los mismos.
  • Es necesario inicializarlos antes de usarlos en programas. Cualquier operaciรณn (excepto la operaciรณn EXISTS) sobre una colecciรณn no inicializada generarรก un error.
  • Puede crearse como un objeto de base de datos, que es visible en toda la base de datos o dentro del subprograma, que solo puede usarse en ese subprograma.

La siguiente figura explicarรก esquemรกticamente la asignaciรณn de memoria de Varray (densa).

subรญndice 1 2 3 4 5 6 7
Valor Xyz dfv editores cxs vbc Nhu qwe

Sintaxis de VARRAY:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • En la sintaxis anterior, type_name se declara como VARRAY del tipo 'DATA_TYPE' para el lรญmite de tamaรฑo indicado. El tipo de datos puede ser simple o complejo.

Tablas anidadas

Una tabla anidada es una colecciรณn en la que el tamaรฑo de la matriz no es fijo. Tiene el tipo de subรญndice numรฉrico. A continuaciรณn se muestran mรกs descripciones sobre el tipo de tabla anidada.

  • La tabla anidada no tiene lรญmite de tamaรฑo superior.
  • Dado que el lรญmite de tamaรฑo superior no es fijo, la memoria de la colecciรณn debe ampliarse cada vez antes de usarla. Podemos ampliar la colecciรณn usando la palabra clave 'EXTEND'.
  • Se completa secuencialmente comenzando con el subรญndice '1'.
  • Este tipo de colecciรณn puede ser de ambos denso y escaso, es decir, podemos crear la colecciรณn como densa y tambiรฉn podemos eliminar el elemento de la matriz individual al azar, lo que la hace escasa.
  • Proporciona mรกs flexibilidad con respecto a la eliminaciรณn del elemento de la matriz.
  • Se almacena en la tabla de base de datos generada por el sistema y se puede utilizar en la consulta de selecciรณn para recuperar los valores.
  • El subรญndice y la secuencia no son estables, es decir, el subรญndice y el recuento del elemento de la matriz pueden variar.
  • Es necesario inicializarlos antes de usarlos en programas. Cualquier operaciรณn (excepto la operaciรณn EXISTS) sobre la colecciรณn no inicializada generarรก un error.
  • Puede crearse como un objeto de base de datos, que es visible en toda la base de datos o dentro del subprograma, que solo puede usarse en ese subprograma.

La siguiente figura explicarรก esquemรกticamente la asignaciรณn de memoria de la tabla anidada (densa y dispersa). El espacio del elemento de color negro indica el elemento vacรญo en una colecciรณn, es decir, escaso.

subรญndice 1 2 3 4 5 6 7
Valor (denso) Xyz dfv editores cxs vbc Nhu qwe
Valor (escaso) qwe Asd afg Asd ยฟQuiรฉn

Sintaxis de tabla anidada:

TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
  • En la sintaxis anterior, type_name se declara como una colecciรณn de tablas anidadas del tipo 'DATA_TYPE'. El tipo de datos puede ser simple o complejo.

รndice por tabla

รndice por tabla es una colecciรณn en la que el tamaรฑo de la matriz no es fijo. A diferencia de otros tipos de colecciรณn, en la colecciรณn รญndice por tabla el subรญndice puede ser definido por el usuario. A continuaciรณn se muestran los atributos de รญndice por tabla.

  • El subรญndice puede ser un nรบmero entero o cadenas. Al momento de crear la colecciรณn se debe mencionar el tipo de subรญndice.
  • Estas colecciones no se almacenan secuencialmente.
  • Siempre son escasos en la naturaleza.
  • El tamaรฑo de la matriz no es fijo.
  • No se pueden almacenar en la columna de la base de datos. Se crearรกn y utilizarรกn en cualquier programa de esa sesiรณn en particular.
  • Dan mรกs flexibilidad en tรฉrminos de mantener el subรญndice.
  • Los subรญndices tambiรฉn pueden tener una secuencia de subรญndices negativos.
  • Son mรกs apropiados para valores colectivos relativamente mรกs pequeรฑos en los que la colecciรณn se puede inicializar y utilizar dentro de los mismos subprogramas.
  • No es necesario inicializarlos antes de empezar a utilizarlos.
  • No se puede crear como un objeto de base de datos. Sรณlo se puede crear dentro del subprograma, que sรณlo se puede utilizar en ese subprograma.
  • BULK COLLECT no se puede utilizar en este tipo de colecciรณn ya que el subรญndice debe proporcionarse explรญcitamente para cada registro de la colecciรณn.

La siguiente figura explicarรก esquemรกticamente la asignaciรณn de memoria de la tabla anidada (escasa). El espacio del elemento de color negro indica el elemento vacรญo en una colecciรณn, es decir, escaso.

Subรญndice (varchar) PRIMERO SEGUNDO TERCER CUARTO QUINTO SEXTO Sร‰PTIMO
Valor (escaso) qwe Asd afg Asd ยฟQuiรฉn

Sintaxis de รญndice por tabla

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • En la sintaxis anterior, type_name se declara como una colecciรณn indexada por tabla del tipo 'DATA_TYPE'. El tipo de datos puede ser simple o complejo. La variable subsciprt/index se proporciona como tipo VARCHAR2 con un tamaรฑo mรกximo de 10.

Constructor y concepto de inicializaciรณn en colecciones.

Los constructores son funciones integradas que proporciona el orรกculo y que tienen el mismo nombre que el objeto o la colecciรณn. Se ejecutan primero cuando se hace referencia al objeto o la colecciรณn por primera vez en una sesiรณn. A continuaciรณn, se muestran los detalles importantes del constructor en el contexto de la colecciรณn:

  • Para las colecciones, estos constructores deben llamarse explรญcitamente para inicializarlas.
  • Tanto las tablas Varray como las anidadas deben inicializarse a travรฉs de estos constructores antes de ser remitidas al programa.
  • El constructor extiende implรญcitamente la asignaciรณn de memoria para una colecciรณn (excepto Varray), por lo que el constructor tambiรฉn puede asignar las variables a las colecciones.
  • Asignar valores a la colecciรณn a travรฉs de constructores nunca harรก que la colecciรณn sea escasa.

Mรฉtodos de recolecciรณn

Oracle proporciona muchas funciones para manipular y trabajar con las colecciones. Estas funciones son muy รบtiles en el programa para determinar y modificar los diferentes atributos de las colecciones. La siguiente tabla muestra las diferentes funciones y su descripciรณn.

Mรฉtodo Descripciรณn SINTAXIS
EXISTE (n) Este mรฉtodo devolverรก resultados booleanos. Devolverรก 'VERDADERO' si el nth El elemento existe en esa colecciรณn; de lo contrario, devolverรก FALSO. Solo se pueden usar funciones EXISTS en una colecciรณn no inicializada .EXISTS(posiciรณn_elemento)
COUNT Da el recuento total de los elementos presentes en una colecciรณn. .COUNT
LIMITE LAS Devuelve el tamaรฑo mรกximo de la colecciรณn. Para Varray, devolverรก el tamaรฑo fijo que se ha definido. Para tabla anidada e รญndice por tabla, da NULL .LIMIT
PRIMERO Devuelve el valor de la primera variable de รญndice (subรญndice) de las colecciones. .FIRST
รšLTIMO Devuelve el valor de la รบltima variable de รญndice (subรญndice) de las colecciones. .LAST
ANTERIOR (n) Los retornos preceden a la variable de รญndice en una colecciรณn de nth elemento. Si no hay ningรบn valor de รญndice anterior, se devuelve NULL .PRIOR(n)
SIGUIENTE (n) Devoluciones suceden a la variable de รญndice en una colecciรณn de nth elemento. Si no hay ningรบn valor de รญndice exitoso, se devuelve NULL .NEXT(n)
AMPLIAR Extiende un elemento de una colecciรณn al final. .EXTEND
EXTENDER (n) Extiende n elementos al final de una colecciรณn. .EXTEND(n)
EXTENDER (n,i) Extiende n copias de ith elemento al final de la colecciรณn .EXTEND(n,i)
TRIM Elimina un elemento del final de la colecciรณn. .TRIM
RECORTAR (n) Elimina n elementos del final de la colecciรณn. .TRIM (n)
BORRAR Elimina todos los elementos de la colecciรณn. Hace que la colecciรณn estรฉ vacรญa. .BORRAR
BORRAR (n) Elimina el enรฉsimo elemento de la colecciรณn. si el norteth elemento es NULL, entonces esto no harรก nada .DELETE(n)
BORRAR (m,n) Elimina el elemento en el rango m.th a nth en la colecciรณn .DELETE(m,n)

Ejemplo 1: Tipo de registro a nivel de subprograma

En este ejemplo, veremos cรณmo completar la colecciรณn usando 'COLECCIร“N A GRANEL' y cรณmo referir los datos de la recopilaciรณn.

Tipo de registro a nivel de subprograma

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); 
BEGIN
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,โ€™AAAโ€™,25000,1000);
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXXโ€™,10000,1000);
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,โ€™ZZZโ€™,'7500,1000);
COMMIT:
SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec
FROM emp;
dbms_output.put_line (โ€˜Employee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_output.put_line (โ€˜Employee Number: '||guru99_emp_rec(i).emp_no); 
dbms_output.put_line (โ€˜Employee Name: '||guru99_emp_rec(i).emp_name); 
dbms_output.put_line (โ€˜Employee Salary:'|| guru99_emp_rec(i).salary); 
dbms_output.put_line(โ€˜Employee Manager Number:'||guru99_emp_rec(i).manager);
dbms_output.put_line('--------------------------------');
END LOOP;
END;
/

Explicaciรณn del cรณdigo:

  • Lรญnea de cรณdigo 2-8: Tipo de registro 'emp_det' se declara con las columnas emp_no, emp_name, salario y administrador de tipo de datos NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Lรญnea de cรณdigo 9: Creando la colecciรณn 'emp_det_tbl' del elemento de tipo de registro 'emp_det'
  • Lรญnea de cรณdigo 10: Declarar la variable 'guru99_emp_rec' como tipo 'emp_det_tbl' e inicializada con un constructor nulo.
  • Lรญnea de cรณdigo 12-15: Insertar los datos de muestra en la tabla 'emp'.
  • Lรญnea de cรณdigo 16: Confirmando la transacciรณn de inserciรณn.
  • Lรญnea de cรณdigo 17: Obtener los registros de la tabla 'emp' y completar la variable de colecciรณn de forma masiva utilizando el comando "BULK COLLECT". Ahora la variable 'guru99_emp_rec' contiene todos los registros que estรกn presentes en la tabla 'emp'.
  • Lรญnea de cรณdigo 19-26: Configurar el bucle 'FOR' para imprimir todos los registros de la colecciรณn uno por uno. El mรฉtodo de recopilaciรณn PRIMERO y รšLTIMO se utiliza como lรญmite inferior y superior del loops.

Salida:Como puede ver en la captura de pantalla anterior, cuando se ejecuta el cรณdigo anterior, obtendrรก el siguiente resultado

Employee Detail
Employee Number: 1000
Employee Name: AAA
Employee Salary: 25000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1002
Employee Name: YYY
Employee Salary: 15000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1003
Employee Name: ZZZ
Employee Salary: 7500
Employee Manager Number: 1000
----------------------------------------------

Resumir este post con: