Continue en un Loop en PL SQL

Imaginen este caso: están en un loop en PL-SQL y quieren que, bajo ciertas condiciones, no continúe su ejecución sino que vuelva al inicio y siga con la siguiente "vuelta". Por ejemplo, un Loop en el que se muestra en consola un valor del 1 al 10 y se quiere que no se muestre el valor 5. Esto sería sencillo:


DECLARE
i     NUMBER := 0;
BEGIN
LOOP
i := i + 1;
EXIT WHEN i > 10;
IF i != 5 THEN
dbms_output.put_line('i: '||i);
END IF;
END LOOP;
END;

Hay casos en los que evaluar mediante un IF THEN no es la mejor solución. Imaginen que dentro del Loop se llama a varios stored procedures que pueden arrojar un error y sólo continuar en caso no ocurra. Se podría hacer algo así, pero no se vería muy bien:


DECLARE
i        NUMBER := 0;
bError   BOOLEAN := FALSE;
BEGIN
LOOP
i := i + 1;
EXIT WHEN i >10 10;
SP_QUE_PUEDE_ARROJAR_ERROR(bError);
IF NOT bError THEN
--(...código)
SP_QUE_PUEDE_ARROJAR_ERROR(bError);
IF NOT bError THEN
--(...código)
SP_QUE_PUEDE_ARROJAR_ERROR(bError);
IF NOT bError THEN
--(...código)
END IF;
END IF;
END IF;
END LOOP;
END;

Como se puede apreciar, con sólo 3 llamadas a procedimientos almacenados, se va formando una "escalera" y el programa se puede hace difícil de seguir (imaginen llamar a 10 procedimientos)

¿Qué hacer?

La solución pasaría por usar una instrucción que detenga la ejecución del loop y vuelva al inicio (como el continue de Java). En Oracle 11, existe una instrucción CONTINUE, así que sería cuestión de hacer:

PLSQL:
  1. --(...)
  2. IF bError THEN
  3. CONTINUE;
  4. --(...)

El problema viene si es que usamos una versión anterior de Oracle, en estos casos podemos usar un truco que consiste en encerrar en dentro de un BEGIN END el código dentro del bucle y lanzar una excepción cuando se produzca un error.

PLSQL:
  1. i                    NUMBER := 0;
  2. bError             BOOLEAN := FALSE;
  3. CONTINUE_EXCEPTION   EXCEPTION;
  4. i := i + 1;
  5. EXIT WHEN i> 10;
  6. SP_QUE_PUEDE_ARROJAR_ERROR(bError);
  7. IF bError THEN
  8. RAISE CONTINUE_EXCEPTION;
  9. --(...código)
  10. SP_QUE_PUEDE_ARROJAR_ERROR(bError);
  11. IF bError THEN
  12. RAISE CONTINUE_EXCEPTION;
  13. --(...código)
  14. SP_QUE_PUEDE_ARROJAR_ERROR(bError);
  15. IF bError THEN
  16. RAISE CONTINUE_EXCEPTION;
  17. --(...código)
  18. WHEN CONTINUE_EXCEPTION THEN
  19. END;

El primer ejemplo (el de imprimir números del 1 al 10 exceptuando el 5, quedaría así):

PLSQL:
  1. i                       NUMBER := 0;
  2. CONTINUE_EXCEPTION   EXCEPTION;
  3. i := i + 1;
  4. EXIT WHEN i> 10;
  5. IF i = 5 THEN
  6. RAISE CONTINUE_EXCEPTION;
  7. DBMS_OUTPUT.put_line('i: '||i);
  8. WHEN CONTINUE_EXCEPTION THEN
  9. DBMS_OUTPUT.put_line('Para el 5 no se imprime nada');
  10. END;

Espero les sea de utilidad.

Linuxfera Enviar a Linuxfera
Entradas Relacionadas:
  • Cursores con parámetros en PL SQL
  • Cursores en PL SQL (1)
  • Malditos programas
  • 1 Respuesta a “Continue en un Loop en PL SQL”


    1. 1 Luis

      esta genial la explicacion muchas gracias :)

    Añade un Comentario