Gestion des exceptions (erreurs d'exécution)

Vous pouvez gérer les exceptions qui se produisent lors de l'exécution avec du code PL/SQL.

Voir aussi : Oracle Database PL/SQL Language Reference, pour plus d'informations sur le traitement des erreurs PL/SQL.

A propos des exceptions et des gestionnaires d'exceptions

Lorsqu'une erreur d'exécution survient dans le code PL/SQL, une exception est déclenchée. Si le sous-programme (ou l'ensemble) ayant déclenché l'exception comporte une part de gestion d'exceptions, cette partie reçoit ce contrôle. Sinon, l'exécution est interrompue.

Les erreurs d'exécution peuvent provenir d'une conception, de défaillances matérielles, de nombreuses autres sources d'erreur.

Oracle Database comporte de nombreuses exceptions prédéfinies, qu'il génère automatiquement lorsqu'un programme enfreint les règles de base de données ou dépasse les limites dépendantes du système. Par exemple, si une instruction SELECT INTO ne renvoie aucune ligne, Oracle Database génère l'exception prédéfinie NO_DATA_FOUND. Pour bénéficier d'un récapitulatif des exceptions PL/SQL prédéfinies, reportez-vous à Oracle Database PL/SQL Language Reference.

PL/SQL permet de définir (déclarer) des exceptions personnalisées. Les déclarations d'exception présentent la syntaxe suivante :

exception_name EXCEPTION;

Contrairement aux exceptions prédéfinies, les exceptions définies par l'utilisateur doivent être déclenchées explicitement, à l'aide de l'instruction RAISE ou de la procédure DBMS_STANDARD.RAISE_APPLICATION_ERROR. Exemple :

IF condition THEN RAISE exception_name;

Pour plus d'informations sur la procédure DBMS_STANDARD.RAISE_APPLICATION_ERROR, reportez-vous au guide Oracle Database PL/SQL Language Reference.

La partie de gestion des exceptions d'un sous-programme comprend des gestionnaires d'exceptions. Le gestionnaire d'exceptions présente la syntaxe suivante :

WHEN { exception_name [ OR exception_name ]... | OTHERS } THEN
  statement; [ statement; ]...

("La section A propos de la structure de sous-programme indique où placer la partie de traitement des exceptions d'un sous-programme.)

Le gestionnaire d'exceptions WHEN OTHERS assure la gestion d'erreurs d'exécution inattendues. S'il est utilisé, il doit figurer en dernière position. Exemple :

EXCEPTION
  WHEN exception_1 THEN
    statement; [ statement; ]...
  WHEN exception_2 OR exception_3 THEN
    statement; [ statement; ]...
  WHEN OTHERS THEN
    statement; [ statement; ]...
    RAISE;  -- Reraise the exception (very important).
END;

Une alternative au gestionnaire d'exceptions WHEN OTHERS est le pragma EXCEPTION_INIT, qui associe un nom d'exception défini par l'utilisateur à un numéro d'erreur Oracle Database.

Voir aussi :

Quand utiliser des gestionnaires d'exceptions

Utilisez des gestionnaires d'exceptions uniquement dans les situations suivantes.

Gestion des exceptions prédéfinies

Vous pouvez gérer les exceptions prédéfinies. L'Example 5-13 montre comment modifier la procédure EMP_EVAL.EVAL_DEPARTMENT pour gérer l'exception prédéfinie NO_DATA_FOUND. Effectuez cette modification et compilez la procédure modifiée. (Pour un exemple de modification d'un corps d'un package, reportez- vous à la section "Tutoriel : Déclaration de variables et de constantes dans un sous-programme".)

Exemple 5-13 Traitement de l'exception prédéfinie NO_DATA_FOUND

PROCEDURE eval_department(dept_id IN employees.department_id%TYPE) AS
  emp_cursor    emp_refcursor_type;
  current_dept  departments.department_id%TYPE;

BEGIN
  current_dept := dept_id;

  FOR loop_c IN 1..3 LOOP
    OPEN emp_cursor FOR
      SELECT *
      FROM employees
      WHERE current_dept = eval_department.dept_id;

    DBMS_OUTPUT.PUT_LINE
      ('Determining necessary evaluations in department #' ||
       current_dept);

    eval_loop_control(emp_cursor);

    DBMS_OUTPUT.PUT_LINE
      ('Processed ' || emp_cursor%ROWCOUNT || ' records.');

    CLOSE emp_cursor;
    current_dept := current_dept + 10;
  END LOOP;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE ('The query did not return a result set');
END eval_department;

Voir aussi : Référence de langage PL/SQL Oracle Database, pour plus d'informations sur les exceptions prédéfinies

Déclaration et gestion des exceptions définies par l'utilisateur

Vous pouvez déclarer et gérer les exceptions définies par l'utilisateur. L'Example 5-14 montre comment modifier la fonction EMP_EVAL.CALCULATE_SCORE pour déclarer et gérer deux exceptions définies par l'utilisateur, incorrect_weight et incorrect_score. Effectuez cette modification et compilez la fonction modifiée. (Pour un exemple de modification d'un corps d'un package, reportez- vous à la section "Tutoriel : Déclaration de variables et de constantes dans un sous-programme".)

Exemple 5-14 Gestion des exceptions définies par l'utilisateur

FUNCTION calculate_score ( evaluation_id IN scores.evaluation_id%TYPE
                         , performance_id IN scores.performance_id%TYPE )
                         RETURN NUMBER AS

  weight_wrong  EXCEPTION;
  score_wrong   EXCEPTION;
  n_score       scores.score%TYPE;
  n_weight      performance_parts.weight%TYPE;
  running_total NUMBER := 0;
  max_score     CONSTANT scores.score%TYPE := 9;
  max_weight    CONSTANT performance_parts.weight%TYPE:= 1;
BEGIN
  SELECT s.score INTO n_score
  FROM SCORES s
  WHERE evaluation_id = s.evaluation_id
  AND performance_id = s.performance_id;

  SELECT p.weight INTO n_weight
  FROM PERFORMANCE_PARTS p
  WHERE performance_id = p.performance_id;

  BEGIN
    IF (n_weight > max_weight) OR (n_weight < 0) THEN
      RAISE weight_wrong;
    END IF;
  END;

  BEGIN
    IF (n_score > max_score) OR (n_score < 0) THEN
      RAISE score_wrong;
   END IF;
 END;

  running_total := n_score * n_weight;
  RETURN running_total;

EXCEPTION
  WHEN weight_wrong THEN
    DBMS_OUTPUT.PUT_LINE(
      'The weight of a score must be between 0 and ' || max_weight);
    RETURN -1;
  WHEN score_wrong THEN
    DBMS_OUTPUT.PUT_LINE(
      'The score must be between 0 and ' || max_score);
    RETURN -1;
END calculate_score;

Voir aussi : Oracle Database PL/SQL Language Reference, pour plus d'informations sur les exceptions définies par l'utilisateur.