Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > AS/400
AS/400 Le Forum d'entraide sur IBM AS/400 - iSeries. RPG.
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 31/03/2008, 16h33   #1
Invité de passage
 
Inscription : mars 2008
Messages : 4
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 4
Points : 1
Points : 1
Par défaut RPG et SQL Embedded

J'utilise des requetes SQL construites dynamiquement avec un curseur pour effectuer des recherches croisées complexes.
Parallelemnt, je souhaite connaitre le nb d'enregistrements résultants de ma requete.
Et la... ça se corse ! Je n'arrive pas à obtenir le résultat dans une variable de mon pgm avec 'INTO :NbrErl' par exemple...
j'obtiens une erreur à l'exécution SQL0312 : 'Variable NBRERL non définie ou non utilisable.'

qq lignes de code :

Eval requetec = 'Select Count(*) into :NbrErl' + requetec
/EXEC SQL
+ PREPARE DYNSQL FROM :REQUETEc
/END-EXEC
/EXEC SQL
+ EXECUTE DYNSQL

Merci
mgas1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 17h14   #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
Code :
1
2
Eval requetec = 'Select Count(*) into ' + NbrErl + ' ' + requetec
 ...
et ça marchera mieux...

ou encore, en SQL statique

/EXEC SQL
+ Select Count(*) into :NbrErl
+ From ...
+ Where ...
/END-EXEC

Pour info, le nombre de lignes mises à jour, deletées, lues (fetch) ou insérées par une requête SQL se trouve dans la variable sqlerrd(3) de la SQLCA, mais malheureusement un select count(*) ne retournera jamais qu'une seule ligne.

Cependant (et ça peut t'intéresser), la variable sqlerrd(3) peut contenir également le nombre estimé de lignes sélectionnées par PREPARE, c'est à dire que tu peux formuler directement ta requête par PREPARE et contrôler immédiatement le nombre estimé de lignes en retour, ce qui pourrait t'éviter de faire le count(*), toujours lourd en I-O.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2008, 17h47   #3
Invité de passage
 
Inscription : mars 2008
Messages : 4
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 4
Points : 1
Points : 1
Citation:
Envoyé par Mercure Voir le message
Code :
1
2
Eval requetec = 'Select Count(*) into ' + NbrErl + ' ' + requetec
 ...
et ça marchera mieux...
Non... NbrErl est une variable numérique qui sert ici à constituer la requete de façon dynamique. Tel que tu l'écris, ça plante donc en compil.

Citation:
ou encore, en SQL statique

/EXEC SQL
+ Select Count(*) into :NbrErl
+ From ...
+ Where ...
/END-EXEC
Non... Les requetes sont constituées dynamiquement en fonction de la demande de l'utilisateur.

Citation:
Pour info, le nombre de lignes mises à jour, deletées, lues (fetch) ou insérées par une requête SQL se trouve dans la variable sqlerrd(3) de la SQLCA, mais malheureusement un select count(*) ne retournera jamais qu'une seule ligne.

Cependant (et ça peut t'intéresser), la variable sqlerrd(3) peut contenir également le nombre estimé de lignes sélectionnées par PREPARE, c'est à dire que tu peux formuler directement ta requête par PREPARE et contrôler immédiatement le nombre estimé de lignes en retour, ce qui pourrait t'éviter de faire le count(*), toujours lourd en I-O.
Je vais essayer ça, merci, mais si qq'un à une idée pour faire mon 'COUNT(*) INTO' en SQL embedded ( ou COUNT(var) pour faire moins lourd).
mgas1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2008, 17h39   #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
Je me suis effectivement trompé sur le "count(*) into ' + NbrErl + ... " mais tu ne couperas pas à une requête statique tel que je l'ai illustrée dans mon post précédent si tu continues à vouloir compter les lignes sans formuler ta requête.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2008, 18h07   #5
Invité de passage
 
Inscription : mars 2008
Messages : 4
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2008
Messages : 4
Points : 1
Points : 1
Par défaut SQLERRD(3) vaut toujours 0 ...

C'est dommage... j'aurai au moins voulu comprendre le pourquoi

Pour le SQLERRD(3) il vaut toujours 0 à l'issue du PREPARE...
mgas1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2008, 12h29   #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
Poutant, si je lis bien la doc SQL référencée ci-dessous à propos de sqlerrd(3) qui se trouve dans la Communication Area de SQL (SQLCA), je constate que

Citation:
Envoyé par DB2 for i5/OS SQL Reference
For the PREPARE statement, [SQLERRD(3) ] contains the estimated number of rows selected. If the number of rows is greater than 2 147 483 647, then 2 147 483 647 is returned.
Si ça ne donne pas le résultat escompté, voir avec le "Point Service IBM"...
Mercure 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 18h55.


 
 
 
 
Partenaires

Hébergement Web