2011-12-19 14 views
7

Sto provando ad eseguire un cursore e voglio che completi il ​​ciclo anche se c'è qualche eccezione.plsql/cursors gestiscono l'eccezione e ritornano al flusso di esecuzione

Quello che sto cercando di fare è "catturare" tutte le eccezioni e probabilmente registrare qualcosa o fare nulla e poi tornare al flusso. Ecco come appare il codice:

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; 

Lo script non viene compilato. Probabilmente c'è un errore sintattico con l'eccezione, ma non mi risulta molto bene la semantica. Come se non fossi sicuro di poter tornare al flusso di esecuzione dopo aver gestito un'eccezione.

p.s: Il DB è 10g e non c'è CONTINUA in esso. Quindi utilizzando GOTO.

+2

Inoltre, 'if' ha bisogno di un then' e' 'if' fine. –

+0

thnx. Era un errore di battitura nella domanda. – codeObserver

+0

Potresti verificare se una delle risposte proposte potrebbe essere considerata accettabile? TIA – lkuty

risposta

16

Inserire il codice che si desidera eseguire all'interno del ciclo nel proprio blocco e quindi è possibile utilizzare la sezione di eccezione dei blocchi per gestire eventuali problemi durante l'iterazione del ciclo.

volta l'eccezione per quella iterazione viene gestito, la prossima iterazione del ciclo inizia

es:

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

Per illustrare questo ulteriore, nell'esempio qui sotto, ho dichiarato una variabile locale di tipo eccezione. Sto eseguendo il looping dei numeri da 1 a 10, durante la seconda iterazione del ciclo, l'istruzione if è vera e l'elaborazione passa al gestore delle eccezioni. Una volta gestita l'eccezione, inizia la successiva iterazione 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. L'ho provato e aggiornato nella domanda. Ancora problemi. C'è bisogno di "inizio" e "fine" nel LOOP? – codeObserver

+2

Sì, per utilizzare la sezione delle eccezioni sono necessarie le sezioni di inizio .. –

+0

aggiornerò la mia risposta con un esempio –

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; 
Problemi correlati