Cómo recorrer un array en Oracle pl/sql

Posted by in Oracle PL/SQL

Es bastante común realizar recorridos de tablas pl en oracle pl/sql desde el primer hasta el último elemento incrementando el índice correlativamente para pasar por todos los elementos de la tabla pl.

Resulta que no es obligatorio que los índices estén ordenados correlativamente, existiendo huecos entre uno y otro elemento. Eso hará que el recorrido falle al no existir el elemento en la posición X.

A continuación podéis observar un recorrido de elementos buscando en cada momento cual es el siguiente, para ello contamos con los tipos de datos T_PROYECTO y T_TABLA_PROYECTO.

Tipo de datos Registro Proyecto

/*
 * Definimos un tipo de datos registro de Proyecto
 */
TYPE T_PROYECTO IS RECORD(
 id      NUMBER        ,
 nombre  VARCHAR2(100)
);


Tipo de datos Array de Proyectos

/*
 * Definimos una tabla de proyectos
 */
TYPE T_TABLA_PROYECTOS IS TABLE OF T_PROYECTO INDEX BY BINARY_INTEGER;

Procedimiento de recorrido de la tabla de proyectos

/*
 * Procedimiento de recorrido de tabla T_TABLA_PROYECTOS
 */
CREATE OR REPLACE PROCEDURE P_RECORRIDO_TABLA_PROYECTOS( P_TABLA_PROYECTOS IN T_TABLA_PROYECTOS ) IS
  --
  I BYNARY_INTEGER;
  --
BEGIN
  /*
   * Comprobamos que la tabla de proyectos tiene al menos un proyecto
   */
  IF P_TABLA_PROYECTOS.COUNT() > 0 THEN
    /*
     * Obtenemos el índice del primer elemento
     */
    I := P_TABLA_PROYECTOS.FIRST
    /*
     * Recorremos la tabla de registros
     */
    LOOP
      /*
       * Hacemos el output a modo de ejemplo
       */
      DBMS_OUTPUT.PUT_LINE( TO_CHAR(P_TABLA_PROYECTOS(I).id) ||
                            ' - '
                            P_TABLA_PROYECTOS(I).nombre );
      /*
       * Salimos del recorrido cuando el índice corresponda al último elemento
       */
      EXIT WHEN I = P_TABLA_PROYECTOS.LAST();
      /*
       * Si no es el último elemento, obtenemos la posición del siguiente elemento
       */
      I := P_TABLA_PROYECTOS.NEXT(I);
      --
    END LOOP;
    --
  END IF;
  --
END P_RECORRIDO_TABLA_PROYECTOS;

Un saludo