2009-05-21 19 views
12

Come si ottiene un programma PL/SQL che termina a metà? Non sono stato in grado di trovare un modo per terminare con garbo il programma se si verifica un'eccezione - se la gestisco, ritorna nel codice.Interrompere un programma PL/SQL

Fondamentalmente quello che voglio fare è forzare l'applicazione a non funzionare in determinate condizioni. Quindi, voglio aggiungere qualcosa di simile per la parte superiore del programma:

BEGIN 
    IF [condition] 
     EXIT 
    END IF 
    [the rest of the program] 
END 

Il modo suggerito è un'eccezione, ma il blocco potrebbe essere un blocco interno - in modo che il programma al di fuori del blocco appena continua

+0

Stai chiedendo come uscire dal blocco BEGIN-END di PL/SQL nel mezzo? –

risposta

1

Non so PL/SQL, ma perché non provare (usando le parole):

BEGIN 
    IF [!condition] 
     [the rest of the program] 
    END IF 
END 

Basta pensare

2

Se si genera un'eccezione che il blocco non gestisce, l'eccezione viene sempre sollevata al chiamante. Quindi il modo più semplice per interrompere l'elaborazione è sollevare un'eccezione che non viene gestita da nessuna parte nello stack di chiamate.

ad es.

+0

In altre parole, non importa se questo è in un blocco interno - finché il blocco esterno non gestisce l'eccezione, non verrà "loopback" nel blocco interno ma verrà propagandato al suo chiamante. Le eccezioni –

+1

non devono essere utilizzate per saltare il codice. stai reinventando goto. –

+1

Non sono d'accordo. PL/SQL non supporta l'istruzione "goto"; e sollevare un'eccezione è una cosa abbastanza diversa da "saltare sul codice". Se il blocco corrente colpisce una condizione per cui non è progettato per far fronte, sollevare un'eccezione è il modo in cui è possibile consigliare il processo di chiamata di quella condizione. –

4

So che è troppo tardi per rispondere, ma ho un altro modo che non è menzionato nelle risposte precedenti.

Utilizzare RAISE_APPLICATION_ERROR e rilevare questa eccezione nella sezione ECCEZIONE. Poiché si esegue il rollback delle transazioni non salvate, assicurarsi di impegnarle esplicitamente se necessario.

In questo modo è possibile tornare con garbo dal programma, invece di eseguire la gestione delle eccezioni nel blocco IF quando si utilizza RETURN.

L'ho usato come riferimento. http://www.plsql-tutorial.com/plsql-exception-handling.htm

0

Finché si utilizzano blocchi pl/sql sequenziali (non nidificati) e la gestione delle eccezioni separata, RAISE funziona perfettamente. Se stai aumentando le eccezioni in blocchi nidificati, fai attenzione alle condizioni della gara.

Problemi correlati