Curseur & violation de contrainte & poursuite du traitement
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:
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:
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:
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