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 :

[Cobol / DB2] Multiple insert et null value


Sujet :

DB2

  1. #1
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut [Cobol / DB2] Multiple insert et null value
    Bonjour,


    Dans un programme cobol on souhaiterai utiliser les insertions multiples via l'utilisation d'un tableau en Working storage.

    Voici la commande exemple SQL utilisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    EXEC SQL                                    
        INSERT INTO XXX/YYY (NOM, PRENOM, AGE) 
        :Z ROWS VALUES                            
        (:WS-TEST)                               
    END-EXEC.
    WS-TEST a été déclaré comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    01 WS-TABLE-INSERT.                             
     02 WS-TEST OCCURS W TIMES.                     
          03 WS-NOM                      PIC X(15). 
          03 WS-PRENOM                   PIC X(15). 
          03 WS-AGE                      PIC S9(13). 
     
    (Z et W sont à remplacer par vos soin)
    Notre Base DB2 supporte les NULL value (valeur utilisée dans une autre application).

    Problème : comment utiliser cette fonctionnalité quand on souhaite insérer des valeur nulls ? (PAr exemple un des 3 champs NOM, PRENOM, AGE est null ?)

    edit: hmm j'aurai du peut-être placer ce thread dans la partie cobol ... au soin des modérateurs si besoin

  2. #2
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Bonjour,

    Pour insérer la valeur NULL, 2 solutions.

    1/ Tu précises le mot-clé NULL en dur dans l'INSERT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE VALUES (:HV1, :HV2, NULL, :HV4)
    Pour ton cas, cela ne peut pas fonctionner puisque tu souhaites faire une insertion multiple.

    2/ Tu te sers des indicateurs.

    Les indicateurs sont des variables cobol définies en PIC S9(4) COMP. Pour mettre NULL, il faut renseigner l'indicateur à -1. Lors de l'INSERT, DB2 vérifie d'abord la valeur de l'indicateur. Si celui-ci est infèrieur à 0, DB2 met NULL sans tenir compte de la valeur de la host variable, sinon DB2 prend la valeur de la host variable. Dans l'INSERT, l'indicateur doit être mis après la host variable avec juste un espace entre les 2 (surtout pas une virgule, cela signifie que tu passes à la colonne suivante).

    Cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE VALUES (:HV1 :IND1, :HV2 :IND2, ...)
    Il faudrait donc que tu essayes de définir ton tableau ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    01 WS-TABLE-INSERT.                             
     02 WS-TEST OCCURS W TIMES.                     
          03 WS-NOM                      PIC X(15).
          03 WS-NOM-IND                  PIC S9(4) COMP.
          03 WS-PRENOM                   PIC X(15).
          03 WS-PRENOM-IND               PIC S9(4) COMP.
          03 WS-AGE                      PIC S9(13).
          03 WS-AGE                      PIC S9(4) COMP.
    Mais je ne sais pas du tout si ça marche en précisant non pas host variable + indicateur mais une host structure globale.

    Bonne utilisation.

  3. #3
    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
    Pour pouvoir gérer les valeurs NULL, tu dois définir une table cobol contenant autant de zones définies en small integer que de postes de la table WS-TEST de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    01  WS-INDIC-TABLE.                                  
        05  WS-INDIC OCCURS 10 TIMES.                     
            10  WS-INDS PIC S9(4) BINARY OCCURS 3 TIMES.
    10 représente le nombre de postes de la table WS-TEST.
    3 représente le nombre de zones à insérer, soit ici Nom, Prénom et Age.

    Ensuite, pour nullifier une valeur dans la clause INSERT, mettre la valeur -1 dans l'indicateur de même niveau d'indice que la zone à mettre à NULL. Par exemple, si je veux nullifier la colonne AGE de mon deuxième enregistrement, j'écrierais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MOVE -1 TO WS-INDS(2 3).
    2 représente ici le deuxième enregistrement et 3 la colonne AGE de ce même enregistrement.

    Pour la forme ou pour raisons de maintenance, je peux mettre à zéro les 2 autres indicateurs associés aux 2 autres colonnes mais ce n'est pas obligatoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MOVE 0 TO WS-INDS(2 1).
    MOVE 0 TO WS-INDS(2 2).
    Enfin, il faut alors codifer l'instruction SQL INSERT de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXEC SQL                                        
        INSERT INTO XXX/YYY (Nom, Prenom, Age)      
          :Z ROWS VALUES (:WS-TABLE :WS-INDIC)      
    END-EXEC.
    Et pour finir, je suis quasiment sûr que la solution 2 de pdz74 codifiée de la façon qu'il montre pour la table cobol et l'instruction INSERT ne fonctionnera pas dans le cas qui nous préoccupe ici, mais toutefois le passage par la valeur NULL ou -1 est ok.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Je viens de tester votre solution Mercure et ca marche nickel.


    Merci bien.

    PS: pour pdz74 j'avais fait des tests dans ce sens là (solution 2) et je n'y étais pas arrivé.

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

Discussions similaires

  1. Insert multiple (INSERT INTO ...VALUES SELECT...)
    Par acognard dans le forum Débuter
    Réponses: 7
    Dernier message: 13/05/2014, 14h42
  2. Réponses: 12
    Dernier message: 25/11/2005, 13h29
  3. Problème Cast avec NULL values
    Par WwiloO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2005, 11h49
  4. Insert null Value
    Par Soulama dans le forum Bases de données
    Réponses: 6
    Dernier message: 06/10/2005, 17h51
  5. insert into table values/ insert into table select
    Par aaronw dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/05/2005, 16h14

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