IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Prévoir un Rollback dans une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 49
    Points : 32
    Points
    32
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ??

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    mais si je commite pas donc je vais pas trouver mes données insérées dans la table non ?!!!!

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Faite le commit à l’extérieur de votre procédure.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 075
    Points
    8 075
    Par défaut
    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 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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"

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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...

    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 : 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
    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.
    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 : 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
    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 :
    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 : 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
    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...

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 075
    Points
    8 075
    Par défaut
    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 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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é.

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Mais, non. Lisez aussi Statement-Level Rollback. Analysez ce code.
    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
    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>

  12. #12
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Et encore un test
    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
     
    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 ?

  13. #13
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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)

  14. #14
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message
    1?
    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
    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>

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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 :
    If the statement raises an unhandled exception
    D'ailleurs j'ai trouvé ailleurs dans Transaction Control
    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
    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.

  16. #16
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    J'ai fini par trouver sur internet Procedure-Level Atomicity dans Expert Oracle Database par Tom Kyte.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    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

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'avez rien à faire, c'est déjà ce que fait Oracle.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 49
    Points : 32
    Points
    32
    Par défaut
    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

  20. #20
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Exécutez la procédure et s'il y a une erreur affichez-la.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Réponses: 2
    Dernier message: 26/05/2010, 23h54
  3. Marquer une pause dans une procédure stockée
    Par PéPénet dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/11/2003, 10h42
  4. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo