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 24/08/2006, 13h37   #1
Invité de passage
 
Inscription : août 2006
Messages : 4
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : août 2006
Messages : 4
Points : 0
Points : 0
Par défaut Pagination - Procédure stockée - FETCH

Salut à tous.

Je souhaite récupérer les n premiers enregistrements d'une, puis les n suivants, etc. pour les afficher dans un programme vb page par page.

Je voudrais récupérer les résultats dans mon result set, grâce à un curseur, mais là je me demande si c'est possible.

Ne faut-il pas plutot passer par une table de travail ?

J'utilise la procédure stockée suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
CREATE PROCEDURE LIMSPRD.ESSAI07(IN PARALG INTEGER)
RESULT SETS 
LANGUAGE SQL 
BEGIN 
 
DECLARE LON INTEGER;
DECLARE IARART CHAR(20); 
DECLARE IARCAT INTEGER;  
DECLARE IARD1  CHAR(30);
DECLARE IARD2  CHAR(30);
DECLARE IARD3  CHAR(30);   
DECLARE IARLST CHAR(20);
DECLARE SQUERY CHAR(512); 
 
DECLARE C1 DYNAMIC SCROLL CURSOR WITH RETURN FOR SELECT ARART,ARCAT,ARD1,ARD2,ARD3,ARLST FROM LIMSPRD.ART;
 
 
OPEN C1;                   
FETCH FIRST FROM C1 FOR 18 ROWS INTO IARART,IARCAT,IARD1,IARD2,IARD3,IARLST;                      
 
END
La compilation me crache les messages suivants :

Code :
1
2
3
4
5
6
 
  Elément syntaxique FOR n'est pas correct.     
  Eléments possibles : INTO.                                
 
  Elément syntaxique IARART n'est pas correct.  
  Eléments possibles : :.

(config : DB2 400 V5R1)
toune018 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 21h03   #2
Membre habitué
 
Inscription : avril 2003
Messages : 284
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : avril 2003
Messages : 284
Points : 124
Points : 124
Envoyer un message via MSN à marsup54 Envoyer un message via Skype™ à marsup54
Je regarde mes sources demain du boulot et j'édite après !

++
marsup54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 00h36   #3
Invité de passage
 
Inscription : août 2006
Messages : 4
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : août 2006
Messages : 4
Points : 0
Points : 0
Merci !
à demain.
toune018 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 09h47   #4
Membre habitué
 
Inscription : avril 2003
Messages : 284
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : avril 2003
Messages : 284
Points : 124
Points : 124
Envoyer un message via MSN à marsup54 Envoyer un message via Skype™ à marsup54
A mon avis, le plus simple : il faut que tu passes par une table temporaire (ou une table fixe).

Voici un exemple de ce que j'ai déjà fait :

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
CREATE PROCEDURE BIBPROCSQL.proc_SuiviTempsCODIR (IN iAnnee_EXC integer, IN iMois_Select integer)
DYNAMIC RESULT SETS 2
LANGUAGE SQL
MODIFIES SQL DATA
P1: BEGIN
    -- Déclaration des variables
	DECLARE iCompteur INT DEFAULT 0;
	DECLARE iNbLignes BIGINT DEFAULT 0;
    -- Déclaration des variables Ressources
    DECLARE dTempsTotal_Lor DOUBLE DEFAULT 0;
    DECLARE dTempsTotal_Lor_Full DOUBLE DEFAULT 0;
    DECLARE dTempsTotal_Par DOUBLE DEFAULT 0;
    DECLARE dTempsTotal_Par_Full DOUBLE DEFAULT 0;
    DECLARE dTempsTotal_INRS DOUBLE DEFAULT 0;
    DECLARE dTempsTotal_INRS_Full DOUBLE DEFAULT 0;
    DECLARE dTemps DOUBLE DEFAULT 0;
    DECLARE sEntite varchar(10);
    DECLARE sActivite varchar(2);
	--------------------------------------
	------ Déclaration des curseurs ------
	--------------------------------------
    DECLARE c1 CURSOR FOR
		SELECT SUBSTRING(A.OBGCOD, 1, 2), REPLACE(REPLACE(B.DCTENT,'N','Lorraine'),'P','Paris'), SUM(B.DCTCHEU)
		FROM SCODSPEFIC.XXOCOM1 A, INRSSPEFIC.DCTHISTOD B WHERE B.DCTEXC = iAnnee_EXC AND SUBSTRING(A.OBGCOD, 1, 2) = '66'
		AND B.DCTMOI <= iMois_Select AND A.COCOMP = B.DCTNCA
		GROUP BY SUBSTRING(A.OBGCOD, 1, 2), B.DCTENT ORDER BY 1,2;
	-- Curseur pour récupérer les données de la table RESSOURCES_CODIR
    DECLARE c3 CURSOR WITH RETURN FOR
		SELECT A.ENTITE, A.ACTIVITE, A.TEMPS, (DECIMAL(A.POURCENTAGE,4,2) || ' %') AS POURCENTAGE
		FROM BIBPROCSQL.RESSOURCES_CODIR A ORDER BY A.ENTITE ASC;
	--------------------------------------------------
	------ Recherche des Ressources (en heures) ------
	--------------------------------------------------
	-- 1) Lorraine
	SELECT SUM(B.DCTCHEU) INTO dTempsTotal_Lor FROM SCODSPEFIC.XXOCOM1 A, INRSSPEFIC.DCTHISTOD B 
	WHERE B.DCTEXC = iAnnee_EXC AND SUBSTRING(A.OBGCOD, 1, 2) = '66' AND A.COCOMP = B.DCTNCA AND B.DCTENT = 'N';
 
	SELECT SUM(B.DCTCHEU) INTO dTempsTotal_Lor_Full FROM SCODSPEFIC.XXOCOM1 A, INRSSPEFIC.DCTHISTOD B 
	WHERE B.DCTEXC = iAnnee_EXC AND SUBSTRING(A.OBGCOD, 1, 1) = '6' AND A.COCOMP = B.DCTNCA AND B.DCTENT = 'N';
	-- 2) Paris
	SELECT SUM(B.DCTCHEU) INTO dTempsTotal_Par FROM SCODSPEFIC.XXOCOM1 A, INRSSPEFIC.DCTHISTOD B 
	WHERE B.DCTEXC = iAnnee_EXC AND SUBSTRING(A.OBGCOD, 1, 2) = '66' AND A.COCOMP = B.DCTNCA AND B.DCTENT = 'P';
 
	SELECT SUM(B.DCTCHEU) INTO dTempsTotal_Par_Full FROM SCODSPEFIC.XXOCOM1 A, INRSSPEFIC.DCTHISTOD B 
	WHERE B.DCTEXC = iAnnee_EXC AND SUBSTRING(A.OBGCOD, 1, 1) = '6' AND A.COCOMP = B.DCTNCA AND B.DCTENT = 'P';
	-- 3) INRS
	SET dTempsTotal_INRS = dTempsTotal_Lor + dTempsTotal_Par;
	SET dTempsTotal_INRS_Full = dTempsTotal_Lor_Full + dTempsTotal_Par_Full;
 
    -- On supprime au préalable les enregistrements dans la table RESSOURCES_CODIR
	SELECT count(*) INTO iNbLignes FROM BIBPROCSQL.RESSOURCES_CODIR A WHERE SUBSTRING(A.ACTIVITE, 1, 1) = '6';
	IF iNbLignes > 0 THEN
	    DELETE FROM BIBPROCSQL.RESSOURCES_CODIR A WHERE SUBSTRING(A.ACTIVITE, 1, 1) = '6';
	    COMMIT;
	END IF;
    -- Ouverture du curseur c1
	OPEN c1;
	SET iCompteur = 0;
    -- boucle de traitement
    WHILE iCompteur < 2 DO
	    FETCH c1 INTO sActivite, sEntite, dTemps;
			INSERT INTO BIBPROCSQL.RESSOURCES_CODIR (ACTIVITE,ENTITE,TEMPS,POURCENTAGE)
			VALUES (sActivite,sEntite,ROUND(dTemps,2),(dTemps/dTempsTotal_INRS*100));
			SET iCompteur = iCompteur + 1;
    END WHILE;
	--Fermeture du curseur c1
	CLOSE c1;
	-- On commit
	COMMIT;
	-- Ouverture du curseur c3
	OPEN c3;
END P1
Dis moi si ça te convient.
marsup54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 10h08   #5
jab
Rédacteur
 
Avatar de jab
 
Homme Jean-Alain Baeyens
SharePoint developpeur
Inscription : février 2004
Messages : 1 172
Détails du profil
Informations personnelles :
Nom : Homme Jean-Alain Baeyens
Âge : 48
Localisation : Belgique

Informations professionnelles :
Activité : SharePoint developpeur
Secteur : Service public

Informations forums :
Inscription : février 2004
Messages : 1 172
Points : 3 131
Points : 3 131
Envoyer un message via ICQ à jab Envoyer un message via MSN à jab Envoyer un message via Skype™ à jab
Regarde cet ancien post sur le sujet. Tu y trouvera peut être la solution.

http://www.developpez.net/forums/showthread.php?t=96246
jab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 11h01   #6
Invité de passage
 
Inscription : août 2006
Messages : 4
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : août 2006
Messages : 4
Points : 0
Points : 0
@marsup :
merci pour ton code, je vais essayer de comprendre tout ça... (débutant en DB2 )


@jab :
j'ai déja visiter ce topic (merci quand même ) ; je voulais utiliser la fonction ROW_NUMBER() mais elle n'existe pas en V5R1...

Merci pour vos réponses !
Je pense que je vais passer par une table, mais il faut que je résolve le problème des accès concurrents.
Je vous tiens au courant de la suite.
toune018 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 15h49   #7
Membre habitué
 
Inscription : avril 2003
Messages : 284
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : avril 2003
Messages : 284
Points : 124
Points : 124
Envoyer un message via MSN à marsup54 Envoyer un message via Skype™ à marsup54
Citation:
... mais il faut que je résolve le problème des accès concurrents.
Je vois pas trop où es le problème ?
Dans mon exemple, je récupère des enregistrements que j'insère dans une table (fonctionne aussi avec une table temporaire) et ensuite, j'ai un autre curseur qui reparcourt la table que je viens de remplir !
Personnellement, j'aurai préféré à l'époque stocker les résultats de mon premier curseur dans un tableau ... mais j'ai jamais trouvé comment on déclarait des variables tableaux sous DB2 ... apparemment, ça ne serait pas possible, alors que en PL/SQL, ça existe bien.

++
marsup54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h53.


 
 
 
 
Partenaires

Hébergement Web