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 24/05/2011, 12h32   #1
Invité régulier
 
Inscription : mars 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 48
Points : 7
Points : 7
Par défaut Prévoir un Rollback dans une procédure

Bonjour mes amis ,

je vous sollicite votre aide SVP

en fait j'ai une procédure plsql

Code :
1
2
3
4
5
6
7
8
CREATE OR REPLACE PROCEDURE sp_Insert(idt varchar2)
IS
BEGIN
         INSERT INTO tab1  
         SELECT * FROM tab  WHERE code =idt ;
         COMMIT ;
 
END;
cette procédure comme vous le remarquez permet d'inserer dans une table
je veux si jamais une exception s'est montée pouvoir effectuer un rollback et annuler l'insertion comment dois je faire cela ??
SALMHSN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h55   #2
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
Code :
1
2
3
4
5
6
7
8
9
CREATE OR REPLACE PROCEDURE sp_Insert(idt varchar2)
IS
BEGIN
         INSERT INTO tab1  
         SELECT * FROM tab  WHERE code =idt ;
         COMMIT ;
         EXCEPTION WHEN OTHERS THEN
                  ROLLBACK;
END;
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h35   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
D'une manière générale ne fait pas de commit dans votre procédure.
Dans votre procédure si une erreur arrive rien n'est inséré dans la table donc faire rollback ne sert strictement à rien.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 18h52   #4
Invité régulier
 
Inscription : mars 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 48
Points : 7
Points : 7
mais si je commite pas donc je vais pas trouver mes données insérées dans la table non ?!!!!
SALMHSN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h54   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Faite le commit à l’extérieur de votre procédure.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 19h50   #6
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 263
Points : 3 263
Citation:
Envoyé par mnitu Voir le message
D'une manière générale ne fait pas de commit dans votre procédure.
Je suis assez d'accord avec ça.
Si une procédure provoque une fin de transaction, il faut vraiment le documenter de manière explicite.

Citation:
Envoyé par mnitu Voir le message
Dans votre procédure si une erreur arrive rien n'est inséré dans la table donc faire rollback ne sert strictement à rien.
Aïe aïe aïe, je n'ose pas imaginer toutes les mauvaises interprétations qui risquent d'être faites ! Du genre "en PL/SQL, dès qu'il y a une erreur, ça fait un ROLLBACK".
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 20h45   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par Pomalaix Voir le message
...
Aïe aïe aïe, je n'ose pas imaginer toutes les mauvaises interprétations qui risquent d'être faites ! Du genre "en PL/SQL, dès qu'il y a une erreur, ça fait un ROLLBACK".
Bref, si tu pense qu'il y a un risque ajoutons des explications "How Oracle Does Implicit Rollbacks"
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 23h22   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Mnitu je suis tout à fait d'accord avec tes premières réponses mais je trouve la doc derrière ton lien obscure...
Mais c'est peut être juste un problème de compréhension de l'anglais...

Citation:
Before executing an INSERT, UPDATE, or DELETE statement, Oracle marks an implicit savepoint (unavailable to you). If the statement fails, Oracle rolls back to the savepoint. Usually, just the failed SQL statement is rolled back, not the whole transaction
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SQL> DROP TABLE t1
  2  /
 
TABLE dropped.
 
SQL> CREATE TABLE t1 (c varchar2(1))
  2  /
 
TABLE created.
 
SQL> 
SQL> begin
  2    INSERT INTO t1 (c) VALUES ('a');
  3    INSERT INTO t1 (c) VALUES ('aa');
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-12899: value too large FOR COLUMN "SKUATAMAD"."T1"."C" (actual: 2, maximum:
1)
ORA-06512: at line 3
 
 
SQL> SELECT * FROM t1
  2  /
 
no rows selected
 
SQL>
Pour moi la transaction a été rollbackée.
Citation:
If the statement raises an unhandled exception, the host environment determines what is rolled back.
Je ne sais pas bien comment inerpréter cette phrase, mais avec sqlplus la transation est rollbackée, idem avec SqlDeveloper et je pense bien que c'est la même chose avec Toad.
Donc il me semble douteux que certains "host environment" se comporte différemment des environements de développement...
A moins qu'il ne fasse simplement référence à :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SQL> INSERT INTO t1 (c) VALUES ('a')
  2  /
 
1 row created.
 
SQL> INSERT INTO t1 (c) VALUES ('aa')
  2  /
INSERT INTO t1 (c) VALUES ('aa')
                           *
ERROR at line 1:
ORA-12899: value too large FOR COLUMN "SKUATAMAD"."T1"."C" (actual: 2, maximum:
1)
 
 
SQL> SELECT * FROM t1
  2  /
 
C
-
a
 
SQL> rollback
  2  /
 
Rollback complete.
 
SQL>
Mais à mon sens (peut être je me trompe) ces 2 inserts représentent 2 transactions.

Idem cette phrase me semble étrange :
Citation:
If you exit a stored subprogram with an unhandled exception, PL/SQL does not assign values to OUT parameters, and does not do any rollback.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SQL> CREATE OR REPLACE procedure p1 (p_val varchar2) AS
  2    begin
  3      INSERT INTO t1 (c) VALUES (p_val);
  4    end;
  5  /
 
Procedure created.
 
SQL> 
SQL> begin
  2    p1 ('a');
  3    p1 ('aa');
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-12899: value too large FOR COLUMN "SKUATAMAD"."T1"."C" (actual: 2, maximum:
1)
ORA-06512: at "SKUATAMAD.P1", line 3
ORA-06512: at line 3
 
 
SQL> SELECT * FROM t1
  2  /
 
no rows selected
 
SQL>
Si quelqu'un veut bien m'aider à comprendre ce que souhaite mettre en évidence la doc...
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 00h37   #9
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 263
Points : 3 263
Citation:
Envoyé par skuatamad Voir le message
...
Je suis complètement d'accord : les passages que vous avez relevés en gras sont pour moi aussi incompréhensibles, tellement ils sont contraires à ce qu'on constate dans la pratique !

(Par contre, dans votre test en SQL pur, il y a forcément une seule transaction puisqu'aucune instruction ne sépare vos 2 INSERT).
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/05/2011, 08h59   #10
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Effectivement il n'y a qu'une seule transaction, merci Pomalaix pour la précision.

Et je suis rassuré de ne pas être le seul à trouver ce passage à minima très mal expliqué.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h11   #11
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Mais, non. Lisez aussi Statement-Level Rollback. Analysez ce code.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> DROP TABLE t1
  2  /
 
TABLE dropped
SQL> CREATE TABLE t1 (c varchar2(1))
  2  /
 
TABLE created
SQL> begin
  2    INSERT INTO t1 (c) VALUES ('a');
  3    INSERT INTO t1 (c) VALUES ('aa');
  4  end;
  5  /
 
begin
  INSERT INTO t1 (c) VALUES ('a');
  INSERT INTO t1 (c) VALUES ('aa');
end;
 
ORA-12899: valeur trop grande pour la colonne "MNI"."T1"."C" (réelle : 2, maximum : 1)
ORA-06512: à ligne 4
SQL> SELECT Count(*)
  2    FROM t1
  3  /
 
  COUNT(*)
----------
         0
SQL> begin
  2    INSERT INTO t1 (c) VALUES ('a');
  3    INSERT INTO t1 (c) VALUES ('aa');
  4  exception
  5    When Others Then
  6      dbms_output.put_line('Err');
  7  end;
  8  /
 
PL/SQL procedure successfully completed
SQL> SELECT Count(*)
  2    FROM t1
  3  /
 
  COUNT(*)
----------
         1
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h41   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Et encore un test
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> SET serveroutput ON
SQL> 
SQL> begin
  2    execute immediate 'begin  insert into t1 values (''a'');  insert into t1 values (''aa''); end;';
  3  exception
  4    when others then
  5      dbms_output.put_line('Err');
  6  end;
  7  /
 
Err
 
PL/SQL procedure successfully completed
Combien des enregistrements sont dans la table t1 ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/05/2011, 09h46   #13
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
1?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 11h02   #14
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par Yanika_bzh Voir le message
1?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> SET serveroutput ON
SQL> SELECT count(*) FROM t1;
 
  COUNT(*)
----------
         0
 
SQL> 
SQL> begin
  2    execute immediate 'begin  insert into t1 values (''a'');  insert into t1 values (''aa''); end;';
  3  exception
  4    when others then
  5      dbms_output.put_line('Err');
  6  end;
  7  /
 
Err
 
PL/SQL procedure successfully completed
 
SQL> SELECT count(*) FROM t1;
 
  COUNT(*)
----------
         0
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 16h05   #15
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par mnitu Voir le message
Mais, non. Lisez aussi Statement-Level Rollback. Analysez ce code.
...
Hum tu penses que c'est à ça qu'il pensait...
Je trouve quand même assez bizarre de vouloir préciser un comportement avec gestion d'erreur non raise en précisant :
Citation:
If the statement raises an unhandled exception
D'ailleurs j'ai trouvé ailleurs dans Transaction Control
Citation:
If your program fails in the middle of a transaction, Oracle detects the error and rolls back the transaction, restoring the database to its former state.
Ce qui me semble en contradiction avec le précédent lien et donc également assez mal formulé, ou au moins un peu léger.

Bon comme souvent tom kyte est bien plus didactique dans sa réponse :
http://asktom.oracle.com/pls/asktom/...43818437682131
Citation:
By default all statements are ATOMIC, the procedure you call either entirely succeeds or entirely fails - UNLESS you

1) put a commit/rollback in there - then game over, the caller of your procedure must deal with the MESS you've left them in - which is an unknown database state (maybe they called 50 other routines before your code - it is UP TO THEM whether they should a) commit, b) rollback, c) retry some operation)

2) put a when others not followed by a raise - then the work that is partially done "stays" and the work never gotten to - is never gotten to. Again, an unknown database state.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 09h04   #16
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
J'ai fini par trouver sur internet Procedure-Level Atomicity dans Expert Oracle Database par Tom Kyte.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/05/2011, 11h38   #17
Invité régulier
 
Inscription : mars 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 48
Points : 7
Points : 7
tout d'abord je vous remercie tous pour votre collaboration ,

en fait je vais essayer de vous expliquer un peu mon probléme ,
j'ai des procedures comme je vous ai déjà montré dans ma premiére intervention mais je veux en fait si jamais une erreur est survenue dans la procédure pouvoir afficher un message d'erreur et annuler la transaction courante !

comment je peux faire çà au niveau de ma procédure plsql
SALMHSN est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/05/2011, 11h44   #18
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 434
Points : 10 434
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous n'avez rien à faire, c'est déjà ce que fait Oracle.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h28   #19
Invité régulier
 
Inscription : mars 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 48
Points : 7
Points : 7
effectivement et tout à fait d'accord mais moi je veux pouvoir afficher l'erreur lors de l'appel de mes procédures au niveau de mon application web
SALMHSN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 13h34   #20
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Exécutez la procédure et s'il y a une erreur affichez-la.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h12.


 
 
 
 
Partenaires

Hébergement Web