Saltar la navegación

Anexo VI.- Ejemplo de recursividad.

Aquí tienes un ejemplo del uso de la recursividad en nuestros subprogramas.

DECLARE
     TYPE agente IS agentes%ROWTYPE;
     TYPE tAgentes IS TABLE OF agente;
     hijos10 tAgentes;
     PROCEDURE dame_hijos( id_familia NUMBER,
                    hijos IN OUT tAgentes ) IS
          CURSOR hijas IS SELECT identificador FROM familias WHERE familia = id_familia;
hija NUMBER;
     CURSOR cHijos IS SELECT * FROM agentes WHERE familia = id_familia;
hijo agente;
     BEGIN
          --Si la tabla no está inicializada -> la inicializamos
          IF hijos IS NULL THEN
               hijos = tAgentes();
          END IF;
          --Metemos en la tabla los hijos directos de esta familia
          OPEN cHijos;
          LOOP
               FETCH cHijos INTO hijo;
               EXIT WHEN cHijos%NOTFOUND;
               hijos.EXTEND;
               hijos(hijos.LAST) := hijo;
          END LOOP;
          CLOSE cHijos;
          --Hacemos lo mismo para todas las familias hijas de la actual
          OPEN hijas;
          LOOP
               FETCH hijas INTO hija;
               EXIT WHEN hijas%NOTFOUND;
               dame_hijos( hija, hijos );
          END LOOP;
          CLOSE hijas;
     END dame_hijos;
BEGIN
     ...
     dame_hijos( 10, hijos10 );
     ...
END;