2009-05-21 9 views
12

¿Cómo puedo obtener un programa PL/SQL para finalizar a la mitad? No he podido encontrar ninguna forma de finalizar el programa de manera elegante si ocurre una excepción; si lo manejo, vuelve al código.Anular un programa PL/SQL

Básicamente lo que quiero hacer es forzar la aplicación para que no se ejecute en ciertas condiciones. Por lo tanto, quiero añadir algo como esto a la parte superior del programa:

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

La forma en que se sugiere es una excepción, pero el bloque también puede ser un bloque interno - por lo que el programa fuera del bloque justo sigue adelante

+0

¿Estás preguntando cómo salir del bloque PL/SQL BEGIN-END en el medio? –

Respuesta

1

No sé PL/SQL, pero ¿por qué no pruebas (usando sus palabras):

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

Sólo de pensar

2

Si usted plantea una excepción que el bloque no maneja, la excepción siempre se eleva a la persona que llama. Entonces, la manera más fácil de detener el procesamiento es generar una excepción que no se maneje en ningún lugar de la pila de llamadas.

p. Ej.

DECLARE 
    e_halt_processing EXCEPTION; 
BEGIN 
    IF [condition] THEN 
     RAISE e_halt_processing; 
    END IF; 
    [the rest of the program] 
END; 
+0

En otras palabras, no importa si se trata de un bloque interno: siempre que el bloque externo no maneje la excepción, no "retrocederá" al bloque interno sino que se propagará a quien llama –

+1

las excepciones no se deben usar para saltar el código. estás reinventando goto –

+1

No estoy de acuerdo. PL/SQL no admite la instrucción "goto"; y elevar una excepción es algo bastante diferente a "saltar sobre el código". Si el bloque actual cumple una condición para la que no está diseñado, la presentación de una excepción es la forma en que puede informar el proceso de llamada de esa condición. –

4

sé que es demasiado tarde para responder, pero tengo una forma más de que no se menciona en las respuestas anteriores.

Utilice RAISE_APPLICATION_ERROR y capture esta excepción en la sección EXCEPCIÓN. Como esto revierte las transacciones no confirmadas, asegúrese de confirmarlas explícitamente si es necesario.

De esta forma, puede regresar con gracia desde el programa, en lugar de realizar el control de excepciones en el bloque IF cuando usa RETORNO.

Lo usé como referencia. http://www.plsql-tutorial.com/plsql-exception-handling.htm

0

Siempre que utilice bloques pl/sql secuenciales (no anidados) y manejo de excepciones por separado, entonces RAISE funciona perfectamente bien. Si está excediendo las excepciones en bloques anidados, tenga cuidado con una condición de carrera.