Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 12/04/2007, 15h54   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 48
Points : 11
Points : 11
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.
jdelges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 16h25   #2
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 098
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 098
Points : 1 707
Points : 1 707
DB2 sur quel OS ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 16h32   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 48
Points : 11
Points : 11
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...
jdelges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 16h36   #4
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 098
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 098
Points : 1 707
Points : 1 707
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 ...
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 16h45   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 48
Points : 11
Points : 11
oui, une procédure stockée quoi, je vais essayer ça...
jdelges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 19h50   #6
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 :
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 08h52   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 48
Points : 11
Points : 11
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...
jdelges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 09h57   #8
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 48
Points : 11
Points : 11
Voilà, c'est pas encore tout à fait complet pour mon cas mais ça fonctionne.

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
 
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 :
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.
jdelges est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 12h49   #9
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 14h20   #10
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 48
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 48
Points : 11
Points : 11
Ah, à propos, ce que tu as écrit, c'est une fonction scalaire SQL et non pas une procédure stockée.

Exact :-)
jdelges est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h25.


 
 
 
 
Partenaires

Hébergement Web