Bonjour,
Je voudrai savoir quelle commande utiliser pour vérifier si une procédure delete, insert ou update a bien été effectué pour que mon programme ne supprime pas l'enregistrement de la table source si un problème est survenu (table bloqué ...)
Bonjour,
Je voudrai savoir quelle commande utiliser pour vérifier si une procédure delete, insert ou update a bien été effectué pour que mon programme ne supprime pas l'enregistrement de la table source si un problème est survenu (table bloqué ...)
Dans quel langage? Script? SQL*PLus? PL/SQL ?
dans sqlplus
p.ex.
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHENEVER SQLERROR EXIT FAILURE ROLLBACK
Dans PL/SQL, gère les exceptions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SQL> create table t(x number primary key); Table created. SQL> WHENEVER SQLERROR EXIT FAILURE ROLLBACK SQL> insert into t(x) values (1); 1 row created. SQL> insert into t(x) values (1); insert into t(x) values (1) * ERROR at line 1: ORA-00001: unique constraint (SCOTT.SYS_C0029695) violated Disconnected from ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 begin insert into t(x) values (1); insert into t(x) values (1); end; / begin * ERROR at line 1: ORA-00001: unique constraint (SCOTT.SYS_C0029695) violated ORA-06512: at line 3
bonjour,
Tu peux utiliser en pl/sql la gestion d'exceptions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Exception when others then
C'est vrai que je ne l'ai pas précisé c'est en pl sql.
Est-il possible de passer cette instruction à l'intérieur d'une boucle?
IL faudrai que j'arrive à sa:
J'ai essayé ceci en dehors de ma boucle sa fonctionne mais pas a l'intérieur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 WHILE condition LOOP .... COMMIT; appel de procedure delete, update ou insert IF delete, update ou insert ne c est pas effectuer THEN ROLLBACK; END IF; ... END LOOP;quel qu'un a une idéé de comment je pourai faire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 EXCEPTION WHEN OTHERS THEN raise_application_error (20000, 'Modification non pris en compte'); ROLLBACK;
tu peux avoir des begin dans les begin...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 BEGIN ... LOOP ... BEGIN INSERT EXCEPTION WHEN ... END; ... END LOOP; ... END;
Bonjour,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 WHILE condition LOOP .... COMMIT; appel de procedure delete, update ou insert IF delete, update ou insert ne c est pas effectuer THEN ROLLBACK; END IF; ... END LOOP;
Vous faites un COMMIT à l'interieur de la LOOP (commit accross FETCH) ce qui n'est pas du tout conseillé pour plusieurs raisons entre autres les suivantes:
(1) parce que c'est une des raisons qui provoque l'erreur ORA-01555 rollback segment snapshot too old
(2) en cas d'erreur survenue dans la nième itération vous auriez alors un traitement à moitié fait et vous allez avoir des problèmes à redémarrer correctement votre programme.
Vous devriez plutôt utiliser ceci
Evidement que le code ci-dessus n'est pas encore complet car il faudrait que le select qui conduit la loop ne considère que les records qui n'ont pas été traités. Ainsi vous auriez un code re-demarable
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
17
18
19
20 LOOP BEGIN -- set a savepoint so that in case of error will rollback SAVEPOINT sav_point; /* your pl/sql code goes here */ EXCEPTION WHEN OTHERS THEN ROLLBACK to sav_point; -- ici il faut prévoir quelque chose pour stocker -- l'erreur dans une table afin de savoir quel record -- est en erreur et pourquoi END; -- next message END LOOP; COMMIT; END;
Bien à vous
Mohamed Houri
Partager