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:
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.
-
i NUMBER := 0;
-
CONTINUE_EXCEPTION EXCEPTION;
-
i := i + 1;
-
SP_QUE_PUEDE_ARROJAR_ERROR(bError);
-
RAISE CONTINUE_EXCEPTION;
-
--(...código)
-
SP_QUE_PUEDE_ARROJAR_ERROR(bError);
-
RAISE CONTINUE_EXCEPTION;
-
--(...código)
-
SP_QUE_PUEDE_ARROJAR_ERROR(bError);
-
RAISE CONTINUE_EXCEPTION;
-
--(...código)
-
NULL;
-
END;
-
END;
El primer ejemplo (el de imprimir números del 1 al 10 exceptuando el 5, quedarÃa asÃ):
Espero les sea de utilidad.




One Comentario
esta genial la explicacion muchas gracias