bonjour,

J'essaye d'insérer des lignes dans une table munie d'une contrainte d'intégrité.
Lorsque les lignes existent déjà, l'insertion plante (très bien).
Mais lorsque j'essaye d'insérer des lignes de manière répétitive avec un curseur dans un bloc de code, l'exécution s'arrête au premier échec d'insertion.

Comment gérer cette exception et poursuivre l'exécution à la valeur suivante du curseur ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE
CURSOR c_sect IS
SELECT id_secteur FROM t_secteur;
BEGIN
  FOR c IN c_sect LOOP
    dbms_output.put_line( To_char( c.id_secteur ) ) ;
    INSERT INTO t_user (id_secteur,id_agent)
    SELECT c.id_secteur,id_agent
    FROM agent
    WHERE id_agent IN('toto','tata') ;
  END LOOP ;
EXCEPTION
   WHEN DUP_VAL_ON_INDEX
   THEN ROLLBACK;
END ;
/
Evidemment, une solution plus propre consisterait à faire une bonne sélection
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
    SELECT c.id_secteur,id_agent
    FROM agent
    WHERE id_agent IN('toto','tata')
    AND NOT EXISTS(
      SELECT id_secteur,id_agent
      FROM t_user
      WHERE id_secteur=c.id_secteur
      AND id_agent IN('toto','tata')
      )
    );
Mais je me pose la question de la gestion de l'exception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
EXCEPTION
   WHEN DUP_VAL_ON_INDEX
   THEN ?? ;
des possibilités et moyens d'arrêter ou poursuivre un curseur

Merci d'avance