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 11/01/2007, 15h19   #1
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
Par défaut [db2/rpgle] SQL direct ?

Bonjour tout le monde,

Voilà je cherche à éxècuter un select SUM(..) complexe qui me retourne donc un résultat unique. De ma pauvre et courte expérience en RPGLE (une succession de select dynamique pour l'instant), je ne connaissais que la structure de SQL dynamique:
Code :
1
2
3
4
5
PREPARE SELECT FROM :var
DECLARE curseur CURSOR FOR SELECT
OPEN curseur
boucle de fetch
CLOSE curseur
Suite à la réponse de Mercure ici dernier post, je me demande si je ne pourrais pas me simplifier grandement la vie! En sachant que, pour une question de réutilisation partielle, ma requête se trouve dans une variable texte, je voudrais savoir s'il y aurait la possibilité d'éxécuter ma requête de "façon directe" (sans utiliser de curseur), genre :
Code :
1
2
3
4
5
 
maReq = SELECT SUM(qqchose) AS monResult FROM maTable
/exec sql
execute immediate maReq
/end-exec
Et je récupère glorieusement mon résultat dans monResult .

Voilà, je sais pas si je me suis bien faite comprendre.
D'avance merci.
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2007, 18h45   #2
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
Encore plus simple et on ne peut plus direct :

Code :
1
2
3
4
c/exec sql SELECT SUM(qqchose) 
c+                into :MonResultat 
c+                FROM maTable
c/end-exec
Remarque : les deux points ( : ) précédant le nom de la variable dans la clause select sont obligatoires

Il ne te reste plus qu'à définir correctement la variable MonResultat dans les spécifs D de ton programme.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2007, 19h44   #3
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
Citation:
Envoyé par Mercure
Encore plus simple et on ne peut plus direct :

Code :
1
2
3
4
c/exec sql SELECT SUM(qqchose) 
c+                into :MonResultat 
c+                FROM maTable
c/end-exec
Remarque : les deux points ( : ) précédant le nom de la variable dans la clause select sont obligatoires

Il ne te reste plus qu'à définir correctement la variable MonResultat dans les spécifs D de ton programme.
En fait, je ne veux pas avoir à taper en dur la requête dans le bloc /exec sql. Je voudrais la définir, avant, dans une variable (je la réutilise à quelques conditions de sélection près chaque fois).

Code :
1
2
3
4
5
6
7
8
9
10
 
eval StringSelect = 'select SUM(qqchose) from maTable '
 
IF "droits insuffisants"
eval maReq = stringSelect + 'where mt > 7500'
endif
 
/exec sql
???
/end-sql
Voili, voilou, je sais pas si je me fais comprendre
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2007, 13h04   #4
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 Curseur ?

A cause de INTO, d'un côté on ne peut pas dynamiquement préparer la totalité du SELECT, mais d'un autre côté grâce à INTO, on évite le curseur à qq réserves près. Maintenant, si ce n'est que la valeur à droite du signe " > " qui change, tu peux faire:

Code :
1
2
3
4
5
c/exec sql SELECT SUM(qqchose) 
c+                into :MonResultat 
c+            FROM maTable
c+            WHERE mt > :MaValeur
c/end-exec
Mais c'est tout.

Si ça ne suffit pas, il faudra passer par un curseur, on n'y coupe malheureusement pas.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2007, 15h08   #5
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
Citation:
Envoyé par Mercure
A cause de INTO, d'un côté on ne peut pas dynamiquement préparer la totalité du SELECT, mais d'un autre côté grâce à INTO, on évite le curseur à qq réserves près.
Quelles sont ces réserves justement? En m'appuyant sur ta réponse j'ai finalement réussi à définir un squelette de requête et de programme de façon à pouvoir utiliser ta solution. Cependant le sqlstate de la requête est 42704 : An undefined object or constraint name was detected.
Ma requête s'appuie sur une vue/table temporaire (je sais pas comment on dit), style :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT SUM(temp.qqchose) INTO :monResultat FROM
(SELECT id, SUM(mt) AS qqchose 
FROM desTables
WHERE ...
toto = :monToto
AND tata = :monTata
GROUP BY id
HAVING  SUM(mt) > :mtMin) temp
C'est assez compliqué(enfin pour moi). Si je teste la requête seule, dans l'entrée SQL, elle fonctionne. Est-ce que la requête est trop complexe pour du SQL direct?
_Jnie_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2007, 16h45   #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
Par défaut expression de table commune

Tu dois pouvoir utiliser une expression de table commune de la façon suivante:

WITH MaTable AS
( SELECT SUM(mt)
FROM desTables
WHERE id = :Monid -- un seul id renvoyé possible sans curseur
AND toto = :monToto
AND tata = :monTata
etc...
GROUP BY id
HAVING SUM(mt) > :mtMin )
SELECT SUM(mt) INTO :monResultat FROM MaTable
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2007, 17h45   #7
Membre régulier
 
Inscription : avril 2006
Messages : 118
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 118
Points : 72
Points : 72
Problème résolu. Honte à moi, en fait il s'agissait d'un problème de bibliothèque . Mais bon, on ne m'avait pas expliqué une petite subtilité, du coup, c'était pas facile à trouver... C'était donc la découverte du jour, méfiez-vous des bibliothèques à l'avenir. Merci de ton aide Mercure.
_Jnie_ 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 00h58.


 
 
 
 
Partenaires

Hébergement Web