PL /SQL Introduction Bloc PL/SQL Déclaration des variable Structure de contrôle Curseurs Les exceptions p Les fonctions et procédures Les packages Les triggers 2013-2014 N.EL FADDOULI 1 Les exceptions Définition Exceptions prédéfinies Exception définie par l'utilisateur 2013-2014 N.EL FADDOULI 38 Page 1 Exceptions: 2 types C’est un mécanisme permettant de dérouter l’exécution normale du bloc vers la section Exception Exception.. Exceptions définies par ORACLE Nommées par oracle Exemples: NO_ DATA_FOUND, DATA_FOUND, TOO_MANY_ROWS TOO_MANY_ROWS,, …. Se déclenchent automatiquement Nécessite de prévoir la prise en compte de l’erreur dans la section EXCEPTION Exceptions définies par l’utilisateur Nommées p par l’utilisateur. Arrêt de l’exécution du bloc Sont déclenchées par une instruction du programme soit automatiquement ( PRAGMA PRAGMA)) Nécessite de prévoir la prise en compte de l’erreur dans la section EXCEPTION Oracle fournit les fonctions SQLCODE et SQLTERRM SQLTERRM,, qui renvoient respectivement le code et le message d'erreur correspondant à l'exception l'exception.. 2013-2014 N.EL FADDOULI 39 Exceptions prédéfinies: exemple Exemple:: Exemple DECALRE SAL empl.salaire%type empl salaire%type empl.salaire salaire%type ; BEGIN SELECT salaire into SAL FROM employe WHERE ville='RABAT' ; ….. EXCEPTION WHEN TOO_MANY_ROWS THEN traitements ; WHEN NO_DATA_FOUND THEN traitements . WHEN OTHERS THEN dbms_output..put_line dbms_output put_line('Code ('Code d'erreur:'|| d'erreur:'||SQLCODE SQLCODE); ); dbms_output..put_line dbms_output put_line('Message ('Message d'erreur:'||SQLERRM d'erreur:'||SQLERRM); ); END; 2013-2014 N.EL FADDOULI 40 Page 2 Exceptions Fonctionnement: lorsqu’une exception est détectée, il y a: 2013-2014 Arrêt de l’exécution du bloc Branchement sur la section exception Parcours des clauses WHEN jusqu’à la bonne Exécution des instructions associées Une fois le traitement de l’erreur terminé,, c’est le bloc suivant qui q est effectué. N.EL FADDOULI 41 Exceptions prédéfinies ACESS_INTO_NULL : On a tenté d'affecter une valeur à un objet non initialisé ORA ORA--6530 CASE_NOT_FOUND CASE_NOT_FOUND: _ _ : Il n'yy a p pas de choix WHEN correspondant p dans une instruction CASE et l'option ELSE n'a pas été définie. définie. ORA ORA--6592 INVALID_NUMBER:: PL/SQL exécute un ordre SQL qui ne parvient pas à INVALID_NUMBER convertir une chaîne de caractères en nombre. nombre. ORA ORA--01722 NO_DATA_FOUND:: Cette exception est déclenchée dans trois cas NO_DATA_FOUND cas:: - Un ordre SELECT INTO qui ne ramène aucun enregistrement enregistrement.. - On référence une ligne g non initialisée d'une table PL/SQL / Q - On tente de lire après la fin d'un fichier avec le package UTL_FILE ORA--01403 ORA TOO_MANY_ROWS:: SELECT INTO a ramené plus d'une ligne ORA TOO_MANY_ROWS ORA--01422 2013-2014 N.EL FADDOULI 42 Page 3 Exceptions prédéfinies: Exercice 1) Ecrire un bloc PL/SQL qui: qui: - Lit deux entiers A et B - Calcule et affiche la division de A par B 2) Exécuter le bloc pour B= B=00. Que remarqueremarque-t-on? 3) Modifier le bloc pour traiter l'exception levée en affichant un message approprié.. approprié 2013-2014 N.EL FADDOULI 43 Exception définie par l’utilisateur Déclaration d’une variable de type EXCEPTION dans la section DECLARE Nom_exception EXCEPTION Définition du traitement associé WHEN Nom_exception THEN traitements ; Déclenchement: Soit associer à cette erreur un code ORACLE, elle sera levée automatiquement: PRAGMA EXCEPTION_INIT (Nom_exception , Code_erreur ) Soit lever manuellement l’exception 2013-2014 RAISE Nom_exception ; N.EL FADDOULI 44 Page 4 Exception définie par l’utilisateur DECLARE ….. Nom_exception EXCEPTION; BEGIN ..................... -- Instructions IF ( condition_erreur ) THEN RAISE Nom_exception ; ……………. EXCEPTION WHEN Nom_exception THEN traitements ; END ; Remarques: on sort du bloc après l’exécution du traitement d’erreur. Les règles de visibilité des exceptions sont les mêmes que celle des variables 2013-2014 N.EL FADDOULI 45 Exemple complet Exemple:: DECLARE Exemple CURSOR employe_rabat IS SELECT nomempl, nomempl, sal FROM employe WHERE ville= ‘ Rabat’ ; nom employe.nomempl employe nomempl %TYPE ; salaire employe.sal %TYPE ; ERR_salaire EXCEPTION ; BEGIN OPEN client_rabat; client_rabat; FETCH employe_rabat INTO nom, salaire ; WHILE employe_rabat employe_rabat% %found LOOP IF salaire IS NULL THEN RAISE ERR_salaire ; ………………….. EXCEPTION WHEN ERR_salaire THEN INSERT INTO temp ( nomempl, nomempl, ‘ salaire non définie’ ) ; WHEN NO_DATA_FOUND THEN INSERT INTO temp ( nomempl, nomempl, ‘ non trouvé’ ) ; END ; 2013-2014 N.EL FADDOULI 46 Page 5 Exception "others " Exception prédéfinie porte le nom de others Permet de traiter toute autre exception non prévue Syntaxe : WHEN OTHERS THEN … Deux fonctions permettent de récupérer des informations sur l’erreur oracle: Sqlcode: retourne une valeur numérique : numéro de l’erreur. Sqlcode: Sqlerrm:: renvoit le libellé de l’erreur. Sqlerrm 2013-2014 N.EL FADDOULI 47 Exemple complet Exemple:: DECLARE Exemple salaire employe.sal %TYPE ; SAL_nulle EXCEPTION ; code number ; message char (50 (50); ); BEGIN SELECT sal INTO salaire from employe; IF salaire= 0 THEN RAISE SAL_nulle SAL_nulle;; END IF EXCEPTION WHEN SAL_nulle THEN ...... -- gérer erreur salaire WHEN TOO_MANY_ROWS THEN ....... -- gérer erreur trop de lignes WHEN NO_DATA_FOUND THEN ........ -- gérer erreur pas de lignes WHEN OTHERS THEN -- gérer toutes les autres erreurs code:= sqlcode ; message:= sqlerrm ; dbms_output..put_line ( ‘erreur: ‘ || code || message ); dbms_output END ; 2013-2014 N.EL FADDOULI 48 Page 6
© Copyright 2024 ExpyDoc