web-dev-qa-db-fra.com

Abandonner un programme PL/SQL

Comment faire en sorte qu'un programme PL/SQL se termine à mi-parcours? Je n'ai pas été en mesure de trouver un moyen de mettre fin au programme gracieusement si une exception se produit - si je le gère, il retourne en boucle dans le code.

Ce que je veux faire, en gros, c'est forcer l'application à ne pas s'exécuter dans certaines conditions. Donc, je veux ajouter quelque chose comme ceci en haut du programme:

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

La manière suggérée est de lancer une exception, mais le bloc peut fort bien être un bloc interne - le programme situé en dehors de ce bloc continue donc.

15
Margaret

Vous pouvez utiliser RETURN

MWATSON@> set serveroutput on
MWATSON@> !cat test.sql

BEGIN
 IF 1 = 1 THEN
    DBMS_OUTPUT.PUT_LINE('ABOUT TO EXIT');
    RETURN;
  END IF;
  DBMS_OUTPUT.PUT_LINE('DID NOT EXIT');
END;

MWATSON@> @test
  8  /
ABOUT TO EXIT

PL/SQL procedure successfully completed.

MWATSON@> 
45
Matthew Watson

Je sais qu'il est trop tard pour répondre, mais j'ai un autre moyen qui n'est pas mentionné dans les réponses précédentes.

Utilisez RAISE_APPLICATION_ERROR et interceptez cette exception dans la section EXCEPTION. Dans la mesure où cela annule les transactions non validées, assurez-vous de les valider explicitement si nécessaire.

De cette façon, vous pouvez revenir gracieusement du programme, au lieu de gérer les exceptions dans un bloc IF lorsque vous utilisez RETURN.

Je l'ai utilisé pour référence. http://www.plsql-tutorial.com/plsql-exception-handling.htm

4
KLeonine

Si vous déclenchez une exception que le bloc ne gère pas, l'exception est toujours levée pour l'appelant. Ainsi, le moyen le plus simple d’arrêter le traitement est de déclencher une exception qui n’est gérée nulle part dans la pile d’appels.

par exemple.

DECLARE
    e_halt_processing EXCEPTION;
BEGIN
    IF [condition] THEN
        RAISE e_halt_processing;
    END IF;
    [the rest of the program]
END;
2
Jeffrey Kemp

Je ne sais pas PL/SQL mais pourquoi ne pas essayer (avec vos mots):

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

Juste à y penser

1
victor hugo

Tant que vous utilisez des blocs pl/sql séquentiels (non imbriqués) et une gestion séparée des exceptions, alors RAISE fonctionne parfaitement. Si vous élevez des exceptions dans des blocs imbriqués, méfiez-vous des conditions de concurrence critique.

0
Mac