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;
0 comentarios:
Publicar un comentario