lunes, 8 de marzo de 2021

Oracle 21c - Mejoras al iterador FOR LOOP - Parte #2

En el articula anterior, "Oracle 21c - Mejoras al iterador FOR LOOP - Parte #1" vimos las mejoras que trae la version 21c de Oracle Database al iterador FOR .. LOOP. En este articulo veremos otras mejoras que permiten utilizar el mismo con colecciones de PL/SQL.


Control de Iteraciones de Colecciones

Existen otros tres nuevos modificadores del iterador FOR .. LOOP que permiten obtener valores en base a colecciones de PL/SQL en vez de rangos. Su funcionamiento es similar al uso de "VALUES OF" y de "INDICES OF" en las operaciones "FORALL" de PL/SQL.

Uso de VALUES OF 

Esta opción nos permite "recorrer" los distintos valores almacenados en un array asociativo de PL/SQL (conocidos como index-by-table) que posee tres elementos, pero cuyos valores de indices se encuentran dispersos (15, 40 y 68):

DECLARE 
  TYPE  TablaT IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
  vTabla TablaT;
BEGIN
  vTabla(15) := 10;
vTabla(40) := 20;
vTabla(68) := 30;
FOR NumVar IN VALUES OF vTabla LOOP
dbms_output.put_line('Soy el numero ' || TO_CHAR(NumVar));
END LOOP; END; / Soy el numero 10 Soy el numero 20 Soy el numero 30 PL/SQL procedure successfully completed. SQL>

Uso de INDICES OF

Esta opción es similar a la opción que vimos anteriormente, pero en vez de obtener los valor asociados a un indice, obtenemos directamente el valor del indice. Usando los mismos datos del ejemplo anterior, podemos ver que obtenemos los valores 15, 40 y 68 que representan los indices del array asociativo que creamos:

DECLARE 
  TYPE  TablaT IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
  vTabla TablaT;
BEGIN
  vTabla(15) := 10;
vTabla(40) := 20;
vTabla(68) := 30;
FOR NumVar IN INDICES OF vTabla LOOP
dbms_output.put_line('Soy el numero ' || TO_CHAR(NumVar));
END LOOP; END; / Soy el numero 15 Soy el numero 40 Soy el numero 68 PL/SQL procedure successfully completed. SQL>

Uso de PAIRS OF

Esta opción nos permite acceder tanto a los valores almacenados en un array asociativo como a los indices asociados a los mismo en un mismo paso. Podemos pensar a la misma como una combinación de las dos opciones que vimos anteriormente. Para comprender su uso, veamos un ejemplo donde almacenamos el valor alfanumérico de cada numero utilizado como índice, y accedemos a ambos en el iterador FOR .. LOOP:

DECLARE 
  TYPE  TablaT IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
  vTabla TablaT;
BEGIN
  vTabla(15) := 'Quince';
vTabla(40) := 'Cuarenta';
vTabla(68) := 'Sesenta y Ocho';
FOR NumVar, TextVar IN PAIRS OF vTabla LOOP
dbms_output.put_line('Soy el numero ' || TO_CHAR(NumVar) || ' que sería ' || TextVar); END LOOP; END; / Soy el numero 15 que sería Quince Soy el numero 40 que sería Cuarenta Soy el numero 68 que sería Sesenta y Ocho
PL/SQL procedure successfully completed. SQL>

No hay comentarios.:

Publicar un comentario