Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/06/2011, 10h15   #1
Candidat au titre de Membre du Club
 
Femme
Inscription : mai 2011
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : mai 2011
Messages : 33
Points : 11
Points : 11
Par défaut Vérification de l'exécution d'une procédure

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é ...)
hidiho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 11h13   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
Dans quel langage? Script? SQL*PLus? PL/SQL ?

dans sqlplus
Code :
WHENEVER SQLERROR EXIT FAILURE ROLLBACK
p.ex.

Code :
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 ...
Dans PL/SQL, gère les exceptions
Code :
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
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/06/2011, 11h21   #3
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
bonjour,

Tu peux utiliser en pl/sql la gestion d'exceptions :

Code :
Exception when others then
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 13h11   #4
Candidat au titre de Membre du Club
 
Femme
Inscription : mai 2011
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : mai 2011
Messages : 33
Points : 11
Points : 11
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:

Code :
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;
J'ai essayé ceci en dehors de ma boucle sa fonctionne mais pas a l'intérieur
Code :
1
2
3
4
    EXCEPTION
    WHEN OTHERS THEN
    raise_application_error (20000, 'Modification non pris en compte');
    ROLLBACK;
quel qu'un a une idéé de comment je pourai faire?
hidiho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 09h55   #5
Candidat au titre de Membre du Club
 
Femme
Inscription : mai 2011
Messages : 33
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : mai 2011
Messages : 33
Points : 11
Points : 11
Ça marche en utilisant ce code dans chaque procédure.
hidiho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h36   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
tu peux avoir des begin dans les begin...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
BEGIN
...
  LOOP
    ...
    BEGIN
       INSERT
    EXCEPTION
      WHEN ... 
    END;
   ...
  END LOOP;
  ...
END;
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/06/2011, 11h03   #7
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Code :
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;
Bonjour,

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

Code :
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;
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

Bien à vous

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h46.


 
 
 
 
Partenaires

Hébergement Web