Rappel : Répondre par vrai ou faux Un curseur est une zone mémoire dans laquelle une commande SQL est analysée et exécutée Un curseur implicite est toujours une commande select Une curseur explicite ne peut être qu une requête «Select. into.» est dite curseur implicite d interrogation V V F V Les Exceptions Un curseur implicite «Select. into.» peut ramener n lignes Un bloc PL/SQL peut contenir plusieurs curseurs %ROWCOUNT et %NOTFOUND sont des attributs de curseurs, utilisables avec les curseurs explicites et implicites F V V Introduction Toute erreur survenue lors de l'exécution d un bloc PL/SQL est appelée une exception.. On distingue 2 principaux types d exceptions : Exceptions internes : Conditions d erreurs connues par Oracle (Détectées implicitement). Certaines sont nommées par Oracle (dites prédéfinies), d autres sont anonymes (dites non prédéfinies) Exceptions utilisateur: Exceptions spécifiques à une application Définies dans le bloc PL/SQL Exceptions Classification des exceptions : Comportement vis à vis d une exception Lorsqu une exception se produit, dans la section exécutable : Le contrôle passe immédiatement à la section des exceptions pour son éventuelle. gestion Le reste de l exécutable du bloc est outrepassé (bypassed). Nommées par Oracle (prédéfinies) Exceptions Internes Anonymes mais nommables par le programmeur. Exceptions-utilisateur Exceptions utilisateur (déclarées dans la section ) 3 4 Comportement vis à vis d une exception Gestion des Exceptions Recherche d un gestionnaire (approprié ou générique). Erreur.... Gérer une exception c est prévoir un traitement afin d absorber. l erreur rencontrée. Résoudre le problème Transformer un. échec en SUCCES Eviter la propagation de l exception vers les blocs parents. Tout bloc PL/SQL contient optionnellement... une section pour la gestion des exceptions. 5 6 1
Gestion des Exceptions Exemple MAGASIN (NumMag, Adresse, Surface) PRODUIT (NumProd, DesProd, Couleur, Poids, Qte_Stk, Qte_seuil, Prix, CodMag# ) Syntaxe -- corps du bloc WHEN nom_exception1 THEN Instructions ; WHEN nom_exception2 THEN Instructions ;.. [ WHEN OTHERS THEN.. ; ] -- fin du bloc Nom_Exceptioni : le nom d une exception (interne ou de l utilisateur). Ecrie un bloc PL/SQL qui affiche la désignation du produit du magasin 10 (Utiliser un curseur implicite et gérer les éventuelles exceptions). V_DesProd Produit.DesProd%type; SELECT DesProd INTO V_DesProd FROM Produit WHERE codmag = 10; DBMS_OUTPUT.PUT_LINE( Designation_Prod v_desprod); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE( Aucun produit dans le magasin 10 ); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE( Plusieurs produits trouvés : utilisez un curseur explicite ); WHEN OTHERS THEN NULL; 7 8 Exception prédéfinie ACCESS_INTO_NULL CASE_NOT_FOUND COLLECTION_IS_NULL CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR Les Exceptions Prédéfinies Les exceptions prédéfinies pour le développement d application Oracle sont des exceptions internes automatiquement levées avec des noms significatifs prédéfinies par Oracles INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR Erreur Oracle ORA-06530 ORA-06592 ORA-06531 ORA-06511 ORA-00001 ORA-01001 ORA-01722 ORA-01017 ORA-01403 ORA-01012 ORA-06501 Exception prédéfinie ROWTYPE_MISMATCH SELF_IS_NULL STORAGE_ERROR SUBSCRIPT_BEYOND_COUNT SUBSCRIPT_OUTSIDE_LIMIT SYS_INVALID_ROWID TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE Erreur Oracle ORA-06504 ORA-30625 ORA-06500 ORA-06533 ORA-06532 ORA-01410 ORA-00051 ORA-01422 ORA-06502 ORA-01476 Exception DUP_VAL_ON_INDEX DUP_VAL_ON_INDEX est levée lorsque une commande SQL tente de placer une valeur dupliquée dans une colonne possédant un index unique créé avec : CREATE UNIQUE INDEX, Contrainte UNIQUE Contrainte PRIMARY KEY. 9 10 Exemple 1 (DUP_VAL_ON_INDEX) Ecrire un bloc PL/SQL qui tente d insérer le magasin numéro 10 (déjà existant) à la table magasin. -- sans Gestionnaire d exception INSERT INTO magasin VALUES (10, SFAX, 100); Le bloc génère l erreur : ORA-00001 : unique constraint violated Exemple 1 (DUP_VAL_ON_INDEX) -- Même exemple AVEC Gestionnaire d exception INSERT INTO magasin VALUES (10, SFAX, 100); WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE( Insertion rejetée ); Insertion rejetée Procédure PL/SQL terminée avec succès 11 12 2
Exemple 2 (DUP_VAL_ON_INDEX) Les Exceptions NO_DATA_FOUND et TOO_MANY_ROWS (Rappel) Ecrire un bloc PL/SQL qui modifie le numéro magasin 11 par 10 (déjà existant). UPDATE Magasin SET NumMag = 10 WHERE NumMag = 11; WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE( Modification Impossible ); Nom Exception TOO_MANY_ROWS NO_DATA_FOUND Condition Un curseur implicite d interrogation identifie plus d une ligne. Un curseur implicite d interrogation n identifie aucune ligne. 13 14 Exception INVALID_CURSOR Cette exception est levée au moment ou un curseur fermé est référencé : dans une.. opération de lecture (FETCH), dans une... opération de fermeture (CLOSE) ou via un des attributs (%FOUND,%NOTFOUND, %ROWCOUNT). Exception Générique OTHERS Un bloc PL/SQL ne peut envisager gérer toutes les erreurs possibles ; cependant il se contente des erreurs les plus significatives en rapport avec le traitement qu il accomplit. L exception prédéfinie OTHERS est une exception générique capable de capter toute erreur pour laquelle aucun gestionnaire n a été prévu dans le bloc. WHEN OTHERS doit être la dernière du bloc. 15 16 Les fonctions SQLCODE et SQLERRM Quand une exception interne se produit, on peut récupérer son code et son message d erreur. Ceci est particulièrement intéressant pour les exceptions manipulées avec OTHERS. SQLCODE SQLERRM Renvoie un entier représentant le n de l erreur interne qui a provoquée l exception ; et zéro sinon (pas d erreur). Renvoie un texte représentant le message d erreur complet associé à l exception rencontrée. ORA-dddddd : texte explicatif Exemple 1 ( SQLCODE et SQLERRM) Quel est le résultat affiché par ce bloc? -- bloc sans erreur dbms_output.put_line('sqlcode : To_char(SQLCODE)); dbms_output.put_line('sqlerrm: SBSTR(SQLERRM,1,80)); SQLCODE : 0 SQLERRM : ORA-00000 : Exécution normale, terminée avec succès. 17 18 3
Exemple 2 ( SQLCODE et SQLERRM) -- Utilisation avec OTHERS when OTHERS then dbms_output.put_line('sqlerrm : SBSTR(SQLERRM,1,80)); Remarques ( SQLCODE et SQLERRM) SQLCODE et SQLERRM ne sont pas utilisables directement dans INSERT (affectez les dans des variables). SQLERRM accepte un paramètre optionnel (n d une erreur) pour retourner le message correspondant. Exemple : SQLERRM(-1403) retoune ORA-01403: no data found 19 20 Les Exceptions de l utilisateur Pour capturer une exception utilisateur, il faut la déclarer et la lever (provoquer) explicitement. Déclarer l exception Nom_exception ; Lever l exception RAISE Nom_exception; Capturer l exception WHEN Nom_exception THEN instructions; Les exceptions de l utilisateur peuvent aussi être capturées par. when others. Les Exceptions de l utilisateur Ecrire un bloc PL/SQL qui lève une exception utilisateur si la Qte_Stk du produit 100 est inférieure à la Qte_seuil du même produit. E_RUP_STK ; V_Qte_Stk Produit.Qte_Stk%TYPE; V_Qte_seuil Produit.Qte_seuil%TYPE; SELECT Qte_Stk, Qte_seuil INTO V_Qte_Stk, V_Qte_seuil FROM Produit WHERE NumProd = 100 AND Qte_Stk < Qte_seuil; RAISE E_RUP_STK; WHEN E_RUP_STK THEN Dbms_output.put_line ( Stock Insuffisant ); WHEN OTHERS THEN NULL; 21 22 Lorsqu un sous-bloc traite une exception, il se termine normalement (succès) et l enchaînement reprend dans le bloc parent immédiatement après l instruction END du sous-bloc. Cependant, si PL/SQL rencontre une exception pour laquelle le bloc courant n a pas prévu un gestionnaire, l exception se propage... c-à-d qu elle se reproduit dans les blocs parents successifs jusqu à ce qu un gestionnaire d exception la capture. Ce principe de propagation s applique à toute sorte d exceptions (internes et utilisateurs). Si aucun des blocs ne traite l exception alors elle se transmet à l environnement hôte. 23 -- déclaration Exception X; Raise X; Section Exécutable Aucun gestionnaire ne peut capturer l exception X Exécution du gestionnaire de X si il existe Si non erreur dans l environnement hôte 24 4
Sections Declare et Exception Toute exception levée dans la section ou se propage et ne peut être traitée dans son bloc même si un gestionnaire d exception approprié ou général (OTHERS) y est prévu. 25 V_NO NUMBER(3) := ABC ; When OTHERS THEN Section (Exemple) Affectation illégale provoque Ne peut être exécutée pour Bloc en échec, Exception VALUE_ERROR reconduite Exécution du gestionnaire de VALUE_ERROR s il existe 26 Section Exception (Exemple) V_NO NUMBER(3); --déclenchement de -- VALUE_ERROR When VALUE_ERROR THEN V_NO := ABC ; When OTHERS THEN. Affectation illégale provoque Ne peut être exécutée pour Bloc en échec, Exception VALUE_ERROR reconduite Exécution du gestionnaire de VALUE_ERROR s il existe 27 Gestion locale et reproduction d une Parfois on a besoin de traiter localement une exception levée, puis de la transmettre au bloc parent. La commande Raise; permet cette reproduction Syntaxe WHEN Nom_exeption THEN -- Gérer localement l exception RAISE; --Reproduit l exception courant 28 Example... WHEN E_Stock _insuffisant THEN -- Gérer localement l exception RAISE; --Reproduit l exception courant --fin sous bloc... WHEN E_Stock _insuffisant THEN -- Gérer l exception differement Exercice : Répondre par vrai ou faux Les exceptions sont des erreurs (ou conditions d erreurs) Un gestionnaire d exception absorbe l erreur pour permettre la continuité du traitement Les exceptions internes sont automatiquement détectées par Oracle Certaines exceptions peuvent êtres nommées Une exception peut être gérée partiellement dans plusieurs blocs imbriqués Une exception gérée ne peut plus être reconduite Un gestionnaire d exception réduit à l instruction NULL signifie accepter et continuer (ou ne pas tenir compte de l erreur) Les exceptions définies par le développeur sont gérables et se reproduisent de la même manière que les exceptions internes 5