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

DB2 Discussion :

Recursion SQL en DB2


Sujet :

DB2

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut Recursion SQL en DB2
    Bonjour,

    Je possède une table avec un varchar scindée, je m'explique.

    Ce varchar de taille 300 est divisé en 12 zones de 25.

    Je souhaite créer une requette SQL qui me permettent de lister en retour chacune des zones. Actuellement, j'utilise celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUBSTR(VARCHAR,1,25) FROM MATABLE
    UNION
    SELECT SUBSTR(VARCHAR,26,25) FROM MATABLE
    UNION 
    ...
    Existe-il une fonction récurrente pour réaliser cette requete sans union ?

    Merci pour votre aide !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 123
    Par défaut
    Vite fait, mal fait en récursif v8 sur z/OS mais bon ça t'aidera j'espère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    DELETE FROM  TESTV ;                                                 
    ---------+---------+---------+---------+---------+---------+--------- 
    DSNE615I NUMBER OF ROWS AFFECTED IS 2                                 
    DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, SQLCODE IS 0             
    ---------+---------+---------+---------+---------+---------+--------- 
    INSERT INTO  TESTV VALUES                                             
    ('AAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBB');               
    ---------+---------+---------+---------+---------+---------+--------- 
    DSNE615I NUMBER OF ROWS AFFECTED IS 1                                 
    DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, SQLCODE IS 0             
    ---------+---------+---------+---------+---------+---------+--------- 
    INSERT INTO  TESTV VALUES                                             
    ('CCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDD');               
    ---------+---------+---------+---------+---------+---------+--------- 
    DSNE615I NUMBER OF ROWS AFFECTED IS 1                                 
    DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, SQLCODE IS 0             
    ---------+---------+---------+---------+---------+---------+--------- 
    COMMIT;                                                               
    ---------+---------+---------+---------+---------+---------+--------- 
    DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL, SQLCODE IS 0             
    ---------+---------+---------+---------+---------+---------+--------- 
      WITH TEST(COL2, COL3, I ) AS                                       
      ( SELECT SUBSTR( COL1 , 1 , 25 ) ,                                 
               SUBSTR( COL1 , 26,  LENGTH(COL1) - 25 )  , 1  FROM TESTV   
        UNION ALL                                                         
        SELECT SUBSTR( COL3 , 1, 25 ) ,                                   
               SUBSTR( COL3 , 26,  LENGTH(COL2) - 25 )  , I + 1   
        FROM TEST                                                 
        WHERE                           I < 12                   
           )                                                     
           SELECT COL2 FROM TEST WHERE COL2 <> ' '               
           ;                                                     
    ---------+---------+---------+---------+---------+---------+- 
    COL2                                                         
    ---------+---------+---------+---------+---------+---------+- 
    CCCCCCCCCCCCCCCCCCCCCCCCC                                     
    AAAAAAAAAAAAAAAAAAAAAAAAA                                     
    DDDDDDDDDDDDDDDDDDDDDDDDD                                     
    BBBBBBBBBBBBBBBBBBBBBBBBB

    ça doit pouvoir s'améliorer.

  3. #3
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    ça me semble être plus un problème d'affichage que de SQL ...

    C'est du DB2 z/OS ? Avec quel outil et pourquoi cet affichage ( 1 zone par ligne ) ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    A priori, c'est ce qu'il me faut ...

    Je test ça demain !

    Merci

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    Salut,

    Sur l'environnement DB2 de Z/OS (je ne l'avais pas précisé), cela ne fonctionne pas.

    Savez vous si cette fonction existe sur ce type de SGBD ?

    A priori, le premier argument du premier Select (1) retourne une partie du varchar (1er zone du varchar) et non la valeur numérique "1".

    comment faire pour contourner cela ?

    Merci

  6. #6
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    Citation Envoyé par Antichoc Voir le message
    Sur l'environnement DB2 de Z/OS (je ne l'avais pas précisé), cela ne fonctionne pas.
    En principe si mais pas sur les anciennes versions.

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Cette exemple n'est valide que si ta table TEST (colonne var) n'a qu'un seul enregistrement comme tu sembles le montrer dans ton premier exemple.
    Si ce n'est pas le cas, dis le afin que la requête soir adaptée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH temp(zone, I) AS                    
      ( SELECT SUBSTR( var , 1 , 25 ) , 1    
               FROM TEST                     
        UNION ALL                            
        SELECT SUBSTR( var, i*25+1, 25 ), i+1
               FROM TEST, temp               
               WHERE I < 12)                 
     
    Select * from temp
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ZONE                                   I 
    AAAAAAAAAAAAAAAAAAAAAAAAA              1 
    BBBBBBBBBBBBBBBBBBBBBBBBB              2 
    CCCCCCCCCCCCCCCCCCCCCCCCC              3 
    DDDDDDDDDDDDDDDDDDDDDDDDD              4 
    EEEEEEEEEEEEEEEEEEEEEEEEE              5 
    FFFFFFFFFFFFFFFFFFFFFFFFF              6 
    GGGGGGGGGGGGGGGGGGGGGGGGG              7 
    HHHHHHHHHHHHHHHHHHHHHHHHH              8 
    IIIIIIIIIIIIIIIIIIIIIIIII              9 
    JJJJJJJJJJJJJJJJJJJJJJJJJ             10 
    KKKKKKKKKKKKKKKKKKKKKKKKK             11 
    LLLLLLLLLLLLLLLLLLLLLLLLL             12

Discussions similaires

  1. Réponses: 16
    Dernier message: 23/09/2009, 22h13
  2. requet sql et db2
    Par wsdl_adr dans le forum DB2
    Réponses: 1
    Dernier message: 23/01/2009, 08h58
  3. dts sql server db2
    Par bidts dans le forum SSIS
    Réponses: 4
    Dernier message: 06/08/2008, 13h54
  4. [AS400] Pb sql recursif db2 as400
    Par lapinae dans le forum DB2
    Réponses: 4
    Dernier message: 30/05/2008, 13h08
  5. Exporter une table SQL dans DB2 ?
    Par Chikh001 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/07/2007, 13h44

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