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 :

SQL dans RPGLE


Sujet :

AS/400

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut SQL dans RPGLE
    Bonjour, j'ai un soucis, je n'arrive pas à faire fonctionner mon sql dans le RPG. Ce n'est pourtant pas la première fois mais je bloque. Voici un extrait du code :
    C/EXEC SQL
    C+ DECLARE C2 SCROLL CURSOR WITH HOLD FOR SELECT DISTINCT NCPSE,
    C+ NSECT FROM NOMENP WHERE NCPSE LIKE :COMPOSE and NSECT = :SECTION
    C/END-EXEC
    **
    **
    C/EXEC SQL
    C+ WHENEVER NOT FOUND GOTO FIN
    C/END-EXEC
    **
    C/EXEC SQL
    C+ OPEN C2
    C/END-EXEC
    **
    **
    C/EXEC SQL
    C+ FETCH CURRENT FROM C2 into ncpse, nsect
    C/END-EXEC

    C'est au Fetch que cela se complique il sort avec un sqlcod à 100 quand je veux qu'il me retourne les variables hotes, si je ne les precise pas il ne sort pas à 100 mais j'ai besoin de ces variables, si quelqu'un est inspiré ......

    je sèche

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Salut,

    Un SQLCOD à 100 avec un curseur en SCROLL, c'est que tu es en fin de fichier. Attention au WITH HOLD !!!! ton curseur reste ouvert.

    Pourquoi fais-tu du SCROLL dans ton cas ? Tu as un commit derrière ?

    Je vois que tu extraits des valeurs distinctes, en as-tu beaucoup ?
    Dans la négative, il serait plus interessant de faire ta requête en statique et mettre le résultat dans un tableau.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    Salut,

    Un SQLCOD à 100 avec un curseur en SCROLL, c'est que tu es en fin de fichier. Attention au WITH HOLD !!!! ton curseur reste ouvert.

    Pourquoi fais-tu du SCROLL dans ton cas ? Tu as un commit derrière ?

    Je vois que tu extraits des valeurs distinctes, en as-tu beaucoup ?
    Dans la négative, il serait plus interessant de faire ta requête en statique et mettre le résultat dans un tableau.


    oui il y a beaucoup de valeurs et c'est le fetch qui dit qu'il ne trouve pas
    mais j'ai peut-être une piste sur le like suivi d'une variable (style XX__XX%)
    quand je remplace en "dur" dans le programme ça fonctionne à priori, le probleme c'est que j'ai une grosse quantité de variable à tester, il faut que je contourne le like peut-être . . .

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Peux-tu être plus clair ?

    Dans ton NCPSE LIKE :COMPOSE
    Qu'as-tu actuemellement dans ton fichier pour cette zone
    et que contient :COMPOSE en déboggage ?

    Si tu es plus précis, peut-être on trouvera un moyen plus efficace pour résoudre le prb

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    Peux-tu être plus clair ?

    Dans ton NCPSE LIKE :COMPOSE
    Qu'as-tu actuemellement dans ton fichier pour cette zone
    et que contient :COMPOSE en déboggage ?

    Si tu es plus précis, peut-être on trouvera un moyen plus efficace pour résoudre le prb
    dans le fichier j'ai COMPOSE = '92AA___C%' par exemple et en debug j'ai bien ceci.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    L'extraction se fait sur la zone NCPSE sur toutes les valeurs commencant par 92AA et ayant en position 8 le caractère C

    Ton fetch CURRENT me paraît bizarre, faudrait voir l'ensemble du code, pourquoi pas un FETCH NEXT ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    L'extraction se fait sur la zone NCPSE sur toutes les valeurs commencant par 92AA et ayant en position 8 le caractère C

    Ton fetch CURRENT me paraît bizarre, faudrait voir l'ensemble du code, pourquoi pas un FETCH NEXT ?
    parce que je l'ai essayé et le résultat était le meme, j'ai donc essaye toutes les valeurs du fetch !

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Je ne sais pas pourquoi tu es en SCROLL WITH HOLD et je ne vois pas de boucle de lecture des enregistrements ni ton CLOSE du curseur.

    Essaye plutôt ceci :

    C/EXEC SQL
    C+ DECLARE C2 CURSOR FOR SELECT DISTINCT NCPSE,
    C+ NSECT FROM NOMENP WHERE NCPSE LIKE :COMPOSE and NSECT = :SECTION
    C/END-EXEC
    **
    **
    C/EXEC SQL
    C+ OPEN C2
    C/END-EXEC
    **
    **
    C/EXEC SQL
    C+ FETCH FIRST FROM C2 into ncpse, nsect
    C/END-EXEC

    C SQLCOD DOWHILE = 0
    C EXSR MON TRAITEMENT
    C/EXEC SQL
    C+ FETCH NEXT FROM C2 into ncpse, nsect
    C/END-EXEC
    C ENDDO

    **
    C/EXEC SQL
    C+ CLOSE C2
    C/END-EXEC
    **

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    Je ne sais pas pourquoi tu es en SCROLL WITH HOLD et je ne vois pas de boucle de lecture des enregistrements ni ton CLOSE du curseur.

    Essaye plutôt ceci :

    C/EXEC SQL
    C+ DECLARE C2 CURSOR FOR SELECT DISTINCT NCPSE,
    C+ NSECT FROM NOMENP WHERE NCPSE LIKE :COMPOSE and NSECT = :SECTION
    C/END-EXEC
    **
    **
    C/EXEC SQL
    C+ OPEN C2
    C/END-EXEC
    **
    **
    C/EXEC SQL
    C+ FETCH FIRST FROM C2 into ncpse, nsect
    C/END-EXEC

    C SQLCOD DOWHILE = 0
    C EXSR MON TRAITEMENT
    C/EXEC SQL
    C+ FETCH NEXT FROM C2 into ncpse, nsect
    C/END-EXEC
    C ENDDO

    **
    C/EXEC SQL
    C+ CLOSE C2
    C/END-EXEC
    **

    La fin du traitement existe je ne l'avait pas rapatriée, mais ça bloque au fetch
    je te transmet un bout du debug :

    160 C*EXEC SQL
    161 C* FETCH FIRST FROM C2 INTO ncpse, nsect
    162 C*END-EXEC
    163 C Z-ADD -4 SQLER6
    164 C CALL SQLROUTE
    165 C PARM SQLCA
    166 C PARM SQL_00007
    167 C SQL_00010 IFEQ '1'
    168 C EVAL XNCPSE = SQL_00012
    169 C EVAL XNSECT = SQL_00013
    170 C END
    171 **
    172 C DOW SQLCOD = 0

    La variable SQL_00010 est à 0 donc mes variables hotes ne seront pas remplies et le SQLCOD = 100 et fin il ne passe pas dans mon traitement
    j'ai meme repris ton code (au fait à la compile il demande un SCROLL au cursor) qui était sensiblement le même que la version que j'avais envoyé

    c'est assez étrange car j'ai retrouvé un programme tres semblable qui tourne toujours, la différence c'est que la variable transmise arrive par un écran de saisie

  10. #10
    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
    Ajoute autant de % jusqu'à remplir la variable COMPOSE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EVAL COMPOSE = %Trim(MaValeur) + '%%%%%%%%'
    ou bien utilise un substring avec COMPOSE en zone réceptrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EVAL COMPOSE = *ALL'%'
    EVAL %Subst( COMPOSE : 1 : %Len( %Trim( MaValeur) ) ) = MaValeur
    puis teste ton SQL.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Mercure Voir le message
    Ajoute autant de % jusqu'à remplir la variable COMPOSE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EVAL COMPOSE = %Trim(MaValeur) + '%%%%%%%%'
    ou bien utilise un substring avec COMPOSE en zone réceptrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EVAL COMPOSE = *ALL'%'
    EVAL %Subst( COMPOSE : 1 : %Len( %Trim( MaValeur) ) ) = MaValeur
    puis teste ton SQL.


    COMPOSE = zone de mon fichier de départ
    j'ai contourné le pb j'ai decompose ma zone en une zone de 4 = 4 premiers car de COMPOSE, et une zone de1 = car 8 de compose et je fais un teste de cette façon :

    /EXEC SQL
    + DECLARE C2 CURSOR WITH HOLD FOR SELECT DISTINCT NCPSE, NSECT
    + FROM NOMENP WHERE
    + SUBSTR(NCPSE, 1, 4) = :car1_4 and SUBSTR(NCPSE, 8, 1) = :car8 and
    + NSECT = :section
    /END-EXEC

    et oh miracle ça fonctionne !!!!!!
    tout ça pour une mise à jour de 2000 lignes

    merci à tous ceux qui ont bien voulu me donner des tuyaux, c'est en parlant qu'on trouve les solutions

  12. #12
    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
    Ah mais je ne voyais pas le pb sous cet angle car AMHA pas exposé clairement aussi
    On peut alors employer le caractères joker " ? " pour ignorer les positions dans la zone de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ... WHERE 
         SUBSTR(NCPSE, 1, 8) = :car1_4 CONCAT '???' CONCAT :car8 AND ...
    Ou bien, mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EVAL MaValeur = %SUBSTR(NCPSE, 1, 8) + '???' + Car8
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE NCPSE = MaValeur AND ...

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

Discussions similaires

  1. SQL dans RPGLE : erreur de données décimales
    Par Lisogane dans le forum AS/400
    Réponses: 6
    Dernier message: 30/12/2010, 23h08
  2. Appel d'un script SQL dans une procdure stockée
    Par doudou10000 dans le forum Oracle
    Réponses: 10
    Dernier message: 01/12/2004, 10h01
  3. SQL dans Procédure stockée
    Par julure dans le forum Oracle
    Réponses: 13
    Dernier message: 02/11/2004, 16h57
  4. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58
  5. [PL/SQL] Utilisation table PL/SQL dans clause IN
    Par Yorglaa dans le forum PL/SQL
    Réponses: 13
    Dernier message: 05/10/2004, 10h36

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