Anuncios en tutorial de programación PLSQL

jueves, 28 de mayo de 2020

Inicialización y asignación de valores a colecciones PL/SQL

Disco duro con colección de datos
Cuando se trabaja en PLSQL con tablas anidadas y varrays (ver artículo sobre los tipos de dato colección del PL/SQL), es necesario inicializar la variable colección antes de que pueda ser utilizada. Para conseguir esto se puede utilizar la denominada función constructora, una función que la base de datos Oracle crea de forma automática cuando se declara la variable colección.

Los que hace la función constructora es construir una instancia del tipo correspondientes al de la función. La función puede ser llamada sin utilizar argumento alguno, aunque también se le pueden pasar una o más expresiones del mismo tipo que sean elementos de la colección PL/SQL, elementos que se insertarán en la colección.

Como casi siempre lo mejor es visualizar todo con un ejemplo:
DECLARE
  TYPE ejemplo_numeros  IS TABLE OF NUMBER;
  l_numeros ejemplo_numeros;
BEGIN
  l_numeros := ejemplo_numeros (4, 5, 6);
END;

En el ejemplo hemos inicializado una tabla anidada de números con tres elementos, los números 4, 5 y 6.

Si por cualquier causa no inicializamos la colección declarada en nuestro código PL/SQL, la base de datos Oracle generará el siguiente error en el momento de que intentemos utilizarla.
SQL> DECLARE
2 TYPE ejemplo_numeros  IS TABLE OF NUMBER;
3 l_numeros ejemplo_numeros;
4 BEGIN
5 l_numeros.EXTEND;
6 l_numeros (1) := 4;
7 END;
8 /
DECLARE
*
ERROR en línea 1:
ORA-06531: Referencia a una recopilación no inicializada
ORA-06512: en línea 5

Por otro lado, no es necesario inicializar una matriz asociativa antes de asignarle valores.

Asignación de valores a una colección

Existen diferentes opciones para asignar valores a los elementos de una colección:
  • Utilizar la función constructora (pata tablas anidadas y varrays).
  • Utilizar el operador de asignación, tanto para colecciones enteras como para elementos simples.
  • Pasar la variable colección a una subrutina PLSQL con un parámetro del tipo OUT (o IN OUT) y asignar los valores dentro de dicha subrutina.
  • Utilizar una consulta SELECT con la cláusula BULK COLLECT.

En el ejemplo anterior ya hemos mostrado como se puede utilizar la función constructora. A continuación pondré otros ejemplos sobre el resto de opciones.

Asignación de un número a un valor índice simple (a señalar es el hecho de que en las matrices asociativas no es necesario utilizar EXTEND, ni empezar por el índice inicial 1):
DECLARE
  TYPE ejemplo_numeros  IS TABLE OF NUMBER
    INDEX BY PLS_INTEGER;
  l_numeros ejemplo_numeros;
BEGIN
  l_numeros (50) := 4567;
END; 

Asignar una colección a otra (el único requisito es que ambas colecciones se hayan declarado como del mismo tipo):
DECLARE
  TYPE ejemplo_numeros IS TABLE OF NUMBER
    INDEX BY PLS_INTEGER;
  l_numeros1 ejemplo_numeros;
  l_numeros2 ejemplo_numeros;
BEGIN
  l_numeros1 (50) := 4567;
  l_numeros2 := l_numeros1;
END;

Pasar a un procedimiento PLSQL una colección como un parámetro de tipo IN OUT (en nuestro ejemplo lo que haremos será vaciar su contenido):
DECLARE
  TYPE ejemplo_numeros IS TABLE OF NUMBER
    INDEX BY PLS_INTEGER;
  l_numeros ejemplo_numeros;
PROCEDURE vaciar_coleccion (
  numeros_inout IN OUT ejemplo_numeros)
IS
BEGIN
  numeros_inout.delete;
END;
BEGIN
  l_numeros (50) := 4567;
  vaciar_coleccion (l_numeros);
END; 

Asignar valores a una colección utilizando una consulta con la cláusula BULK COLLECT (en este enlace encontraréis más información sobre el procesamiento BULK COLLECT):
DECLARE
  TYPE ejemplo_numeros  IS TABLE OF NUMBER
    INDEX BY PLS_INTEGER;
  l_numeros ejemplo_numeros;
BEGIN
  SELECT documento_id
    BULK COLLECT INTO l_numbers
    FROM documentos
    ORDER BY nombre_documento;
END; 

1 comentarios:

Unknown dijo...

Gracias!