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.
Enviar a Linuxfera Entradas Relacionadas:
Posts RSS
Vía Email













esta genial la explicacion muchas gracias