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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 49
    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 confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    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 confirmé 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
    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
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 49
    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 confirmé 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
    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 461
    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 461
    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".

  7. #7
    Expert confirmé 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
    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 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    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
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    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.
    Dans votre procédure si une erreur arrive rien n'est inséré dans la table donc faire rollback ne sert strictement à rien.
    Bonjour, je prends la post en cours de route, je suis en train de creuser côté ROLLBACK & COMMIT, je suis sous ORA 11g.

    Lorsque vous dites de ne pas commiter dans une procédure, je comprends les débordements possibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- bloc anonyme
    BEGIN
     maProc1() -- ne contient pas de COMMIT, insert une ligne dans une table
     maProc2() -- contient un COMMIT et se comporte comme maProc1 => le COMMIT prend en compte les lignes inserées de maProc1 et maProc2
     -- potentiel problème de COMMIT sur des événements non désirés
    END;
    Si j'interprète bien, il est dangereux de commiter dans une procédure car elle peut prendre en compte les actions d'autres événements. Par contre si le COMMIT doit se faire à l'extérieur des procédures, dans un bloc plus global, comment gère-t'on les potentiels SAVEPOINT ou ROLLBACK intra-procédures si besoin ? Part-on du principe que c'est l'intégralité du résultat d'une procédure qui doit être commitée ou rollbackée ?

    Si vous avez des exemples complets de la manière de gérer plusieurs procédures avec COMMIT et ROLLBACK je serais volontiers preneur.

    Merci et bonne fin de journée,

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