PL / SQL propose un mécanisme robuste de maintien des exceptions pour gérer gracieusement les erreurs d'exécution et empêcher les plantages d'application. Le cœur de ce mécanisme tourne autour du bloc EXCEPTION
dans un bloc PL / SQL. Ce bloc est utilisé pour attraper et gérer les exceptions qui se produisent lors de l'exécution du bloc BEGIN
précédent.
La structure de base ressemble à ceci:
<code class="sql">DECLARE -- Declare variables BEGIN -- Your PL/SQL code here EXCEPTION WHEN OTHERS THEN -- Handle any unhandled exception WHEN NO_DATA_FOUND THEN -- Handle the NO_DATA_FOUND exception WHEN ZERO_DIVIDE THEN -- Handle the ZERO_DIVIDE exception WHEN TOO_MANY_ROWS THEN -- Handle the TOO_MANY_ROWS exception -- ... other WHEN clauses for specific exceptions ... END; /</code>
La clause WHEN OTHERS
est un fourre-tout pour toute exception non manipulée explicitement en WHEN
les clauses. Il est crucial d'inclure cela pour empêcher la terminaison de programme inattendue, bien qu'il doit être utilisé avec parcimonie et avec une journalisation minutieuse pour identifier la source de l'erreur. Il est généralement préférable de gérer des exceptions spécifiques chaque fois que possible pour des messages d'erreur plus informatifs et des stratégies de récupération ciblées. Utiliser WHEN OTHERS
sans journalisation appropriée peuvent masquer de graves problèmes.
PL / SQL a plusieurs types d'exceptions prédéfinis, chacun représentant un type d'erreur spécifique. Certains des plus courants comprennent:
NO_DATA_FOUND
: soulevé lorsqu'une SELECT INTO
l'instruction ne renvoie pas de lignes. Ceci est facilement identifié par son message d'erreur spécifique.ZERO_DIVIDE
: relevé lorsqu'une tentative est faite pour diviser par zéro. Encore une fois, le message d'erreur est clair.TOO_MANY_ROWS
: soulevé lorsqu'une déclaration SELECT INTO
renvoie plus d'une ligne. Cela indique un défaut dans la clause de WHERE
.DUP_VAL_ON_INDEX
: soulevé lorsqu'une tentative est faite pour insérer une valeur en double dans un index unique.INVALID_NUMBER
: soulevé lors de la tentative de convertir une chaîne non numerique en un nombre.VALUE_ERROR
: Soulevé pour diverses erreurs liées au type de données, comme essayer d'attribuer un type de données incorrect à une variable.CURSOR_ALREADY_OPEN
: élevé lorsque vous essayez d'ouvrir un curseur déjà ouvert.OTHERS
: un fourre-tout pour toute exception non manipulée explicitement. L'identification de ces exceptions implique généralement l'examen du message d'erreur renvoyé par la base de données. Oracle fournit des messages d'erreur détaillés qui identifient souvent le type d'exception et sa cause. Vous pouvez accéder à ces informations à l'aide de SQLCODE
(qui renvoie un code d'erreur numérique) et SQLERRM
(qui renvoie un message d'erreur textuel) dans le bloc EXCEPTION
.
L'amélioration des erreurs et de l'exploitation forestière est cruciale pour un débogage efficace. Voici comment améliorer votre gestion des erreurs PL / SQL:
Journalisation détaillée: au lieu d'afficher simplement un message d'erreur générique, enregistrez des informations détaillées, notamment:
SQLCODE
et SQLERRM
).DBMS_OUTPUT
. DBMS_OUTPUT
convient aux tests et au développement, mais pas aux systèmes de production.RAISE_APPLICATION_ERROR
.Exemple de journalisation améliorée:
<code class="sql">PROCEDURE my_procedure(p_input IN NUMBER) IS v_result NUMBER; BEGIN -- ... your code ... EXCEPTION WHEN OTHERS THEN INSERT INTO error_log (error_time, procedure_name, sqlcode, sqlerrm, input_parameter) VALUES (SYSTIMESTAMP, 'MY_PROCEDURE', SQLCODE, SQLERRM, p_input); COMMIT; RAISE; -- Re-raise the exception to be handled by a calling procedure, if necessary. END; /</code>
Pour assurer un comportement d'application robuste, suivez ces meilleures pratiques:
WHEN OTHERS
. Gérez les exceptions spécifiques chaque fois que possible pour une gestion des erreurs plus précise.RAISE
Judiciely: RAISE
Ressens une exception, permettant aux procédures d'appel de le gérer. Utilisez-le stratégiquement pour propager les exceptions de la pile d'appels.ROLLBACK
pour annuler toutes les modifications apportées pendant la transaction si l'opération a échoué. Cela garantit l'intégrité des données.En suivant ces directives, vous pouvez améliorer considérablement la robustesse et la fiabilité de vos applications PL / SQL. Une gestion efficace des exceptions est cruciale pour la construction d'applications maintenables et conviviales.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!