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 :

lock d'une ligne renvoyée par un select


Sujet :

DB2

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Points : 28
    Points
    28
    Par défaut lock d'une ligne renvoyée par un select
    Bonjour,

    J'ai besoin de verrouiller une ligne dans une table, faire en sorte que personne ne puisse LIRE cette ligne...


    Donc en résumé, une table contient des IDS à utiliser dans d'autre tables, je dois lire dans cette table la ligne qui m'intéresse et la verrouiller, prendre le numéro, l'incrémenter, écrire le nouveau numéro et déverrouiller.


    Donc si deux transactions tournent en même temps, il faut que la deuxième attende que la première soit terminée avant de pouvoir lire la ligne.

    PS: avant le fichier était accédé uniquement par du cobol.

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    DB2 sur quel OS ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    os400 v5r3

    PS: s'il n'y a pas d'autre choix, je verrouille toute la table la requête ne prends pas plus de 1 sec de toute façon...

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    En DB2 for z/OS on aurait pu faire un curseur (obligatoire dans ce cas) avec un SELECT ... FOR UPDATE OF ...
    Je ne sais pas si ça marche aussi avec DB2 OS/400 ...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    oui, une procédure stockée quoi, je vais essayer ça...

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Oui Luc, on peut aussi le faire sur AS400. Tant que la table n'aura pas été mise à jour, la ligne (l'enreg.) sera verrouillée.

    Exemple en RPG IV:

    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
    c/exec sql declare csr cursor for              
    c+         Select MonCompteur
    c+         From   MaTable                     
    c+         Where  ...  
    c+         For    Update  of  MonCompteur
    c/end-exec                                     
     
    c/exec sql open csr                            
    c/end-exec      
     
    // MonCompteur est une variable déclarée en spécif D 
     
    c/exec sql fetch csr into :MonCompteur 
    c/end-exec     
     
     /free
       MonCompteur += 1;
      /end-free
     
    c/exec sql Update MaTable                   
    c+         Set   MonCompteur = :MonCompteur
    c+         Where Current of csr              
    c/end-exec                 
     
    c/exec sql close csr
    c/end-exec
    Ce n'est pas une procédure stockée qui me semble inutile ici, mais du RPG IV avec SQL intégré dans le programme.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Merci, mais je pense que je vais le faire avec une procédure stockée SQL, ce sera plus simple à utiliser pour du Java (que de faire appel à du RPG par Java) .

    Je vous donne la solution une fois que je l'aurai trouvée...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Voilà, c'est pas encore tout à fait complet pour mon cas mais ça fonctionne.

    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
     
    CREATE FUNCTION TMISSOBJ.GETNEWNUMGLOB() 
    RETURNS CHAR(48)
     
    	LANGUAGE SQL 
    	SPECIFIC tMISSOBJ.GETNEWNUMGLOB
    	NOT DETERMINISTIC 
    	MODIFIES SQL DATA 
    	CALLED ON NULL INPUT  
     
    	BEGIN
     
    	DECLARE STR_RET CHAR(48); 
     
    	DECLARE CSR CURSOR FOR 
    	SELECT CTLIB
    	FROM TMISSDTA.DATPARF 
    	WHERE CTSOCI = 1 
    	AND CTLANG = 0 
    	AND CTRANG = 90000 
    	AND CTCODI = 'PRR001BI80' 
    	FOR UPDATE OF CTLIB;
     
    	OPEN CSR;
     
    	FETCH CSR INTO STR_RET;
     
    	UPDATE TMISSDTA.DATPARF
    	SET       CTLIB = TRIM(STR_RET) || 'JF'
    	WHERE  CURRENT OF CSR; 
     
    	CLOSE CSR;
     
    	RETURN STR_RET;
     
    END  ;
    Pour obtenir la valeur, très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select tmissobj.getnewnumglob() from sysibm.sysdummy1;
    Il y a un autre problème: le fait que les librairies à utiliser soient écrites en dur... (j'aimerais que le moteur sql aille voir dans la library list) mais c'est un autre problème. Merci pour votre aide.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Fonction
    Mets la bibliothèque concernée en *CURLIB pour éviter d'avoir à qualifier les objets dans la fonction.

    Ah, à propos, ce que tu as écrit, c'est une fonction scalaire SQL et non pas une procédure stockée.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Ah, à propos, ce que tu as écrit, c'est une fonction scalaire SQL et non pas une procédure stockée.

    Exact :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/01/2012, 16h23
  2. Nombre de lignes renvoyé par une requete
    Par colonnel dans le forum JDBC
    Réponses: 7
    Dernier message: 12/05/2010, 21h09
  3. Nombre de lignes renvoyées par un SELECT
    Par eowene dans le forum Zend Framework
    Réponses: 7
    Dernier message: 04/12/2007, 09h42
  4. Limiter le nombre d'enregistrements renvoyés par un SELECT
    Par Wilco dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/11/2004, 13h47
  5. sélection d'une ligne DBGrid par clic
    Par duffman dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/05/2004, 13h45

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