salida procedimientos procedimiento parametros funciones entrada ejemplos ejecutar developer con almacenado oracle continue

procedimientos - procedimiento almacenado oracle select



Palabra clave ''CONTINUAR'' en Oracle 10g PL/SQL (8)

¿Puede refactorizar los IF en una función, volviendo al punto apropiado (temprano si es necesario). Luego, el flujo de control se recuperará en el bucle en el lugar correcto.

¿Tiene sentido?

Estoy migrando un procedimiento almacenado TSQL a PL / SQL y he encontrado un problema: la falta de una palabra clave CONTINUAR en Oracle 10g.

He leído que Oracle 11g tiene esto como una nueva característica, pero actualizar no es una opción desafortunadamente.

¿Hay alguna alternativa para CONTINUAR en 10g? No creo que sea práctico reestructurar la lógica del SP como una solución alternativa, porque tengo un bucle externo, un IF, luego un IF anidado, luego el CONTINUAR al final de un bloque de instrucciones dentro de ese IF.

Cualquier ayuda sería muy apreciada, ¡salud!


Aunque es un poco complejo y solo falso, puedes usar la excepción de esta manera:

DECLARE i NUMBER :=0; my_ex exception; BEGIN FOR i IN 1..10 LOOP BEGIN IF i = 5 THEN raise my_ex; END IF; DBMS_OUTPUT.PUT_LINE (i); EXCEPTION WHEN my_ex THEN NULL; END; END LOOP; END;


De hecho, PL SQL tiene algo para reemplazar CONTINUAR. Todo lo que tienes que hacer es agregar una etiqueta (un nombre) al ciclo:

declare i integer; begin i := 0; <<My_Small_Loop>>loop i := i + 1; if i <= 3 then goto My_Small_Loop; end if; -- => means continue exit; end loop; end;


En Oracle hay una declaración similar llamada EXIT que sale de un bucle o una función / procedimiento (si no hay un bucle para salir). Puede agregar un CUÁNDO para verificar alguna condición.

Puede volver a escribir el ejemplo anterior de la siguiente manera:

DECLARE done BOOLEAN; BEGIN FOR i IN 1..50 LOOP EXIT WHEN done; END LOOP; END;

Esto puede no ser suficiente si quiere salir de algunos bucles anidados y lógica, pero es mucho más claro que un par de GOTOs y NULLs.



No exactamente elegante, sino simple:

DECLARE done BOOLEAN; BEGIN FOR i IN 1..50 LOOP IF done THEN NULL; ELSE <do loop stuff>; END IF; END LOOP; END;


Para futuras búsquedas, en Oracle 11g agregaron una declaración de continue , que se puede usar así:

SQL> BEGIN 2 FOR i IN 1 .. 5 LOOP 3 IF i IN (2,4) THEN 4 CONTINUE; 5 END IF; 6 DBMS_OUTPUT.PUT_LINE(''Reached on line '' || TO_CHAR(i)); 7 END LOOP; 8 END; 9 / Reached on line 1 Reached on line 3 Reached on line 5 PL/SQL procedure successfully completed.


Puede simular un continuar usando goto y etiquetas .

DECLARE done BOOLEAN; BEGIN FOR i IN 1..50 LOOP IF done THEN GOTO end_loop; END IF; <<end_loop>> -- not allowed unless an executable statement follows NULL; -- add NULL statement to avoid error END LOOP; -- raises an error without the previous NULL END;