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

AS/400 Discussion :

RPG et SQL Embedded


Sujet :

AS/400

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    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 : 4
    Points
    4
    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

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    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 : 4
    Points
    4
    Par défaut
    Citation Envoyé par Mercure Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    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.

    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).

  4. #4
    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
    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.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    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 : 4
    Points
    4
    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...

  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
    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"...

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

Discussions similaires

  1. Formation - Remise à niveau RPG IV - SQL
    Par webisfun dans le forum AS/400
    Réponses: 3
    Dernier message: 12/07/2012, 13h02
  2. Réponses: 8
    Dernier message: 06/03/2010, 07h36
  3. Sql server express 2005 et windows xp embedded
    Par semenzato dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 04/02/2008, 10h08
  4. embedded sql en c
    Par lity7 dans le forum C
    Réponses: 1
    Dernier message: 16/03/2007, 13h17
  5. [RPG/400] Intégrer du SQL
    Par curt25 dans le forum Autres langages
    Réponses: 1
    Dernier message: 24/01/2007, 11h50

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