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

DB2 Discussion :

Transactions en DB2 ?


Sujet :

DB2

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Transactions en DB2 ?
    Bonjour à tous !

    Je recherche désespérément de l'aide afin de comprendre comment fonctionnent les transactions avec DB2 dans un script.
    Si cela ne me pose pas de soucis avec PostgreSQL, MariaDB ou MsSQL, je dois avouer que je suis totalement perdu en DB2.

    J'ai tenté ce genre de chose :
    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
     
    SAVEPOINT before_updates ON ROLLBACK RETAIN CURSORS;
     
    UPDATE table_xxxxx
    SET column1 = column1 - 100
    WHERE column2 = 'ABC';
     
    IF SQLCODE <> 0 THEN
        ROLLBACK TO SAVEPOINT before_updates;
    ELSE
        UPDATE table_xxxxx
        SET column1 = column1 + 100
        WHERE column2 = 'ABC';
     
        IF SQLCODE <> 0 THEN
            ROLLBACK TO SAVEPOINT before_updates;
        END
    END
     
    COMMIT;
    Mais pour ce cas, j'ai un message d'erreur SQL 42601: SQL0199 (le mot clé IF est mal placé...)

    Je n'ai pas non plus compris comment désactiver l'auto-commit (ni comment savoir s'il est actif), ou s'il est obligatoire de passer par une procédure stockée...
    Bref, je suis au niveau zéro de la connaissance en DB2 et je ne serais pas contre un peu d'aide.

    Merci !


    Environnement : DB2 AS400/iAccess V7R1 ou V7R2... je suis pas certains...
    Pas d'accès à la console. Exécution des requêtes via DBeaver.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Bonjour, effectivement il faut passer par une procédure stockée pour passer l'enchaînement "d'ordres".

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    1. Euh... il est nécessaire de faire autant de procédures que j'ai de transaction différentes ?
    2. Il y a moyen de le faire avec un script ? (1.création de la procédure 2.exécution 3.suppression de la procédure)
    3. Au final, quelle est la bonne pratique pour exécuter 2 requêtes (ou plus) nécessitant une transaction, est qui ne sera utilisé qu'une seule fois ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    En fait qu'entends-tu par transaction ? Sous quelle forme tu as un écran qui invoque ces ordres DB2 ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Par transaction, je veux dire une suite de requêtes qui dépendent les unes des autres et qui seront validées (COMMIT) uniquement si tout se passe bien, sinon l'ensemble des requêtes est annulé (ROLLBACK)

    Concernant "l'écran", je passe par DBeaver pour l'exécution des requêtes.
    Je viens de voir que j'ai aussi accès au "terminal" (interface en mode texte).

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Tu es donc obligé de passer par procédure stockée ou programme qui contient l'enchaînement des ordres.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 55
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    Il est aussi possible d'utiliser un compound statement https://www.ibm.com/docs/en/i/7.4?topic=statements-compound-dynamic".

    DBeaver ne les reconnait pas bien, il faut les sélectionner entièrement avant de l'exécuter, ou changer le caractère de fin d'instruction dans les préférences

    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
    BEGIN
      declare sqlcode integer;
     
      SAVEPOINT before_updates ON ROLLBACK RETAIN CURSORS;
     
      UPDATE table_xxxxx
      SET column1 = column1 - 100
      WHERE column2 = 'ABC';
     
      IF SQLCODE <> 0 THEN
        ROLLBACK TO SAVEPOINT before_updates;
      ELSE
        UPDATE table_xxxxx
        SET column1 = column1 + 100
        WHERE column2 = 'ABC';
     
        IF SQLCODE <> 0 THEN
          ROLLBACK TO SAVEPOINT before_updates;
        END IF;
      END IF;
     
      COMMIT;
    END

Discussions similaires

  1. Db2 10.5 linux ( centos 7) XA transaction manager?
    Par thibaultG dans le forum DB2
    Réponses: 0
    Dernier message: 17/01/2017, 11h40
  2. Réponses: 4
    Dernier message: 19/10/2011, 03h10
  3. Transaction DB2 avec 2 instructions en VB.NET
    Par asmduty dans le forum DB2
    Réponses: 9
    Dernier message: 16/04/2011, 22h24
  4. Apropos des Transactions au sein d'un Stored Procedure
    Par Sarbacane dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 16/11/2004, 08h21
  5. [DB2] Au sujet de...
    Par Eric Denné dans le forum DB2
    Réponses: 2
    Dernier message: 16/09/2002, 19h21

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