2011-12-19 7 views
7

Estoy intentando ejecutar un cursor y quiero que complete el ciclo incluso si hay alguna excepción.plsql/cursores manejan la excepción y regresan al flujo de ejecución

Lo que trato de hacer es "atrapar" todas las excepciones y, probablemente, registrar algo o no hacer nada y luego volver al flujo. Así es como se ve el código:

FOR line IN my_cursor 
LOOP 
begin 

    if<condition> then 
     GOTO pass; 
    else  
    <<do_something>> 
    exception 
     when others then 
     sys.dbms_output.put_line('say something');  
    end if; 

    <<pass>> null; 
end 
END LOOP; 

El script no se compila. Probablemente haya algún error sintáctico con la excepción, pero tampoco conozco muy bien la semántica. Al igual que no estoy seguro de si puede volver al flujo de ejecución después de manejar una excepción.

p.s: La base de datos es 10g y no hay CONTINUACIÓN en ella. Por lo tanto, usando GOTO.

+2

Además, 'if' necesita un' 'then' y if' final. –

+0

thnx. Fue un error tipográfico en la pregunta. – codeObserver

+0

¿Podría verificar si una de las respuestas propuestas podría calificarse como aceptable? TIA – lkuty

Respuesta

16

Ponga el código que desea ejecutar dentro del bucle en su propio bloque y luego puede usar esa sección de excepción de bloques para manejar cualquier problema durante la iteración del bucle.

Una vez que se controla la excepción de que iteración, la siguiente iteración del bucle se iniciará

por ejemplo:

for line in my_cursor 
loop 
    begin  
     <<do_something>> 
    exception 
     <<do_exception_processing>>   
    end; 
end loop; 

Para ilustrar esto aún más, en el siguiente ejemplo, he declarado una variable local de tipo excepción. Estoy recorriendo los números del 1 al 10, durante la segunda iteración del bucle, la declaración if es verdadera y el procesamiento pasa al manejador de excepciones. Una vez que se maneja la excepción, comienza la siguiente iteración del ciclo.

begin 

    for i in 1 .. 10 
    loop 

     declare 

     my_exception exception; 

     begin 

     if i = 2 
     then 

      -- if you need to do some processing then you would enter it 
      -- here and then when you want to enter the exception section 
      -- you would add the line below 

      raise my_exception; 

     end if; 

     exception 
     when my_exception then 
      dbms_output.put_line('in exception section'); 

     end; 

    end loop; 

end; 
+1

Thnx Ian. Intenté eso y lo actualicé en la pregunta. Todavía tiene problemas. ¿Hay una necesidad de "comenzar" y "finalizar" en el LOOP? – codeObserver

+2

Sí, para usar la sección de excepción, se requieren las secciones begin .. end –

+0

Actualizaré mi respuesta con un ejemplo –

7
FOR line IN my_cursor 
LOOP 
    if not some_condition then 
    begin 
     do_something; 
    exception  
     when others then log_my_error(); -- this should be something that uses 
             -- an autonomous transaction 
    end; 
    end if; 
END LOOP; 
0
BEGIN 
FOR Line in My_Cursor LOOP 
    IF condition THEN 
BEGIN 
    do something... 
END; 
    ELSE 
BEGIN 
    do something... 
END; 
    END IF; 
END LOOP; 
EXCEPTION 
WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('say something'); 
END; 
Cuestiones relacionadas