A partir de Oracle 21c se agregan tres nuevos tipos opciones de iterador para su uso en expresiones calificadas. El uso de expresiones calificadas mejora la claridad de los programas y la productividad del programador. Las mismas se encuentran disponibles desde Oracle 18c, incorporando nuevas funcionalidades en Oracle 21c.
Algunas de estas mejoras están asociadas a otras mejoras PL/SQL, como ser las del iterador FOR .. LOOP que vimos en los dos artículos anteriores (parte #1 y parte #2)
Iteradores
Iterador por Indice
DECLARE TYPE TablaT IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;; vTablaT TablaT; BEGIN -- vTablaT := TablaT (FOR i in 2 .. 4 index i * 2 => i * 3); -- END;
Indice=4 Valor=6 Indice=6 Valor=9 Indice=8 Valor=12
Lo que hace el iterador es recorrer la lista de valores declaradas en la cláusula FOR (en nuestro caso, del 2 al 4) y asignarle al indice el resultado de "i * 2", y almacenar el valor "i * 3" en la colección. Como vemos, ambas expresiones pueden usar el valor del iterando "i".
En nuestro ejemplo usamos un array asociativo con valores numéricos, pero los mismos podrían ser de cualquier tipo de datos (varchar, date, etc.). Este iterador acepta la mayoría de las mejoras que se incorporaron en Oracle 21c al iterador FOR .. LOOP, como ser saltear valores, detenerse al llegar a una condición dada, o iterar en saltos distintos de 1, como mostramos a continuación:
DECLARE TYPE TablaT IS TABLE OF DATE INDEX BY PLS_INTEGER;; vTablaT TablaT; BEGIN -- vTablaT := TablaT (FOR i IN 1..10 BY 2 WHEN i > 5 INDEX i => SYSDATE + i); -- END;
Iterador por Secuencia
DECLARE TYPE TablaT IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;; vTablaT TablaT; BEGIN -- vTablaT := TablaT (FOR i in 2 .. 4 SEQUENCE => i * 3); -- END;
Indice=1 Valor=6 Indice=2 Valor=9 Indice=3 Valor=12
La diferencia con el ejemplo anterior es que los índices en este caso se calcularon en forma automática con valores secuenciales comenzando por el 1, mientras que usamos el valor del iterador en la expresión que calcula el valor a almacenar en la colección.
Al igual que el iterador por indice, el iterador por secuencia permite el uso de la mayoría de las mejoras de Oracle 21c realizadas a FOR .. LOOP.
Iterador Básico
DECLARE TYPE TablaT IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;; vTablaT TablaT; BEGIN -- vTablaT := TablaT (FOR i in 2 .. 4 => i * 3); -- END;
Indice=2 Valor=6 Indice=3 Valor=9Indice=4 Valor=12
Notación Posicional para Array Asociativo
Adicionalmente a estos nuevos iteradores, Oracle 21c simplifica aun mas la asignación de valores a un array asociativo cuando no usamos iterador. A continuación veremos la evolución en las últimas versiones de Oracle.
Previo a Oracle 18c
DECLARE TYPE TablaT IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
vTablaT TablaT; BEGIN -- vTablaT(1) := 'Diez';
vTablaT(2) := 'Veinte';
vTablaT(3) := 'Treinta';
END; /
Oracle 18c
DECLARE TYPE TablaT IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
vTablaT TablaT; BEGIN -- vTablaT := TablaT(1 => 'Diez', 2 => 'Veinte', 3 => 'Treinta'); END; /
Oracle 21c
DECLARE TYPE TablaT IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
vTablaT TablaT; BEGIN -- vTablaT := TablaT('Diez', 'Veinte', 'Treinta');
END; /
Como vemos, en Oracle 21c no necesitamos indicar el valor del indice usando la notación posicional, el mismo es generado en forma automática comenzando con 1.
Links
Recomendamos leer la documentación oficial de Oracle para tener un mejor conocimiento de estas nuevas características.
No hay comentarios.:
Publicar un comentario