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

PL/SQL Oracle Discussion :

Générer un fichier csv avec entête, le corps est le résultat de la requête


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut Générer un fichier csv avec entête, le corps est le résultat de la requête
    Bonjour

    pour des raisons de migrations de données, je souhaite construire le fichier suivant :
    Un fichier CSV avec un entête et le résultat dans le corps .
    le fichier est le suivant :

    ##
    ART_CLIENT               CLI
    ##
    1234568                    MaineSA
    ##
    Les séparateurs sont de l’ordre de la tabulation.

    Comment vous voyez la chose, j'ai pensé à construire un prog en pl/sql

    Merci à vous

  2. #2
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Une possibilité : faire du spool
    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
     
    set embedded on
    set underline off
    set pagesize 0
    set termout off
    set heading off
    set heads on
    set linesize 2000 -- plus long si nécessaire
    set feedback off
    set trimspool on
    spool MonFichier.csv
      prompt ART_CLIENT;CLI
      select ART_CLIENT || ';' || CLI
        from MA_TABLE;
    spool off

  3. #3
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut Merci
    Bonjour merci pour la réponse.
    Le spool vas surtout permettre de retourner le résultat de la requête ds un fichier txt, mais ne vas pâs me rajouter des lignes ...

  4. #4
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Je ne vois aucune phrase explicative sur "ajouter des lignes".
    Si le besoin pour cette discussion n'est pas de générer des fichiers, quel est-il ?

  5. #5
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut Je m'explique
    Désolé si je me suis mal expliqué par rapport au besoin

    au fait je souhaite avoir cette structure :

    ##
    ART_CLIENT CLI
    ##
    1234568 MaineSA
    ##
    cad


    ## : générer les doubles dièses
     la ligne ART_Client Client avec un séparateur au milieu
    ## : générer les doubles dièses
    Résultat de la requête : 1234568 MaineSA Avec séparateur au milieu
    ## : générer les doubles dièses
    J’espère que je suis explicite la..? lol

    Merci

  6. #6
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    prompt permet de générer une ligne fixe :
    Le séparateur peut être défini par une constante, hormis dans le prompt qui est du texte pur.

  7. #7
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut Cool
    Merci par contre il reconnait pas le prompt en fin de programme.?

  8. #8
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Le prompt fonctionne aussi à la fin.
    Les requêtes se terminent bien par ";" et les begin ... end; par "/" ?

  9. #9
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut Oui
    Ca ne marche pas....
    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
    Begin
    SET embedded ON
    SET underline off
    SET pagesize 50
    SET termout off
    SET heading off
    SET heads ON
    SET linesize 2000 
    SET feedback off
    SET trimspool ON
    SPOOL U:\E-Agriciel\Sortie_plsql.csv
        prompt ##
        prompt  ID_ARTICLE,ID_DOMAINE_DEPOT,QUANTITE,DATE_ACTIVITE,BOOL_TXT
        SELECT 
           CAST (PART_NO AS VARCHAR(30)) AS ID_ARTICLE,
           CAST (LOCATION_NO AS VARCHAR(30)) AS ID_DOMAINE_DEPOT,
           TO_CHAR(QTY_ONHAND,'9999990D9999'),
           to_char(LAST_ACTIVITY_DATE , 'YYYYMMDD') AS DATE_ACTIVITE,
           CASE WHEN ENG_CHG_LEVEL IS NULL THEN '0' ELSE '1' END Selection_du_Booleen 
        FROM  INVENTORY_PART_IN_STOCK
        WHERE PART_NO = '20816902'
    SPOOL OF;
    End;

    le résultat :
    ds le prompt pas de tabulation et pas de prompt a la fin.

  10. #10
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut Cool
    le résultat s'affine cool
    le code est le suivant :

    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
    SET embedded ON
    SET underline off
    SET pagesize 50
    SET termout off
    SET heading off
    SET heads ON
    SET linesize 2000 
    SET feedback off
    SET trimspool ON
    SPOOL U:\E-Agriciel\Sortie_plsql.csv
        prompt ##
        prompt ID_ARTICLE,ID_DOMAINE_DEPOT,QUANTITE,DATE_ACTIVITE,BOOL_TXT
        Prompt ##
        SELECT 
           CAST (PART_NO AS VARCHAR(30)) AS ID_ARTICLE,
           CAST (LOCATION_NO AS VARCHAR(30)) AS ID_DOMAINE_DEPOT,
           TO_CHAR(QTY_ONHAND,'9999990D9999') AS DATE_ACTIVITE,
           to_char(LAST_ACTIVITY_DATE , 'YYYYMMDD') AS DATE_ACTIVITE,
           CASE WHEN ENG_CHG_LEVEL IS NULL THEN '0' ELSE '1' END Selection_du_Booleen 
        FROM  INVENTORY_PART_IN_STOCK
        WHERE PART_NO = '20816902'
    Par contre je n'arrive toujours pas a mettre des tabulations dans le prompt au lieu de la virgule.

    Merci

  11. #11
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Plusieurs choses :
    1. le bloc "begin end" en début et fin est inutile
    2. la requête ne se termine pas par ";"
    3. les commandes "spool" et "spool off" ne nécessite pas de ";"
    4. la concaténation des colonnes doit être réalisée manuellement via "|| ',' ||" entre chaque colonne au
      lieu de ","
    5. pas d'alias lors de concaténation
    6. le pagesize était à zéro pour ne pas générer de ligne parasite au bout de 50 lignes
    7. je n'ai pas modifié mais pour formater il vaut mieux faire "lpad" ou "rpad" que cast qui dans ce contexte ne doit pas fonctionner


    d'où le code
    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
     
    SET embedded ON
    SET underline off
    SET pagesize 50
    SET termout off
    SET heading off
    SET heads ON
    SET linesize 2000 
    SET feedback off
    SET trimspool ON
    SPOOL U:\E-Agriciel\Sortie_plsql.csv
    prompt ##
    prompt ID_ARTICLE,ID_DOMAINE_DEPOT,QUANTITE,DATE_ACTIVITE,BOOL_TXT
    SELECT 
    CAST (PART_NO AS VARCHAR(30)) || ',' ||
    CAST (LOCATION_NO AS VARCHAR(30)) || ',' ||
    TO_CHAR(QTY_ONHAND,'9999990D9999') || ',' ||
    to_char(LAST_ACTIVITY_DATE , 'YYYYMMDD') || ',' ||
    CASE WHEN ENG_CHG_LEVEL IS NULL THEN '0' ELSE '1' END 
    FROM INVENTORY_PART_IN_STOCK
    WHERE PART_NO = '20816902';
    SPOOL OF

  12. #12
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut
    J'ai résolu merci .

    Par contre je n'ai toujours pas la tabulation au niveau du prompt. le résultat est le suivant :
    ##
    ID_ARTICLE,ID_DOMAINE_DEPOT,QUANTITE,DATE_ACTIVITE,BOOL_TXT
    ##
    20816902                       PEINTURE                              1,0000 20140219        1
    20816902                       REPRISE                               0,0000 20131230        1
    20816902                       SOUDURE                               0,0000 20140220        1
    Je souhaite une tabulation au lieu de la virgule comme cela :
    ID_ARTICLE                       ID_DOMAINE_DEPOT                       QUANTITE                       DATE_ACTIVITE                       BOOL_TXT
    Merci pour tous

  13. #13
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Ce code ne fonctionne pas ? (tabulation dans le prompt)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prompt ID_ARTICLE	ID_DOMAINE_DEPOT

  14. #14
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut ok
    Merci ci-joint le résultat avec une capture d’écran.
    merci à vousNom : srvtse6 - Connexion Bureau à distance_2014-03-04_15-45-14.png
Affichages : 3285
Taille : 3,8 Ko

  15. #15
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut merci
    ca m'intrigue le résultat entre les colonnes et celui ds prompt, on dirait que ce n'est pas la même tabulation, au niveau longueur. ?

  16. #16
    Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Points : 47
    Points
    47
    Par défaut
    Il faudrait voir le fichier texte produit pour être sur du décalage.
    Au niveau Oracle le caractère tabulation est chr(9).

  17. #17
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut OK
    Merci à vous .. je vais voir cela et désolé pour le retards ..

  18. #18
    Membre du Club
    Homme Profil pro
    PartNumber
    Inscrit en
    Octobre 2012
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : PartNumber
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 309
    Points : 65
    Points
    65
    Par défaut
    Re bonjour

    Le problème persiste en effet:

    1 impossible de mettre de la tabulation dans le prompt : Peut on mettre du le chr(9) dans un prompt ..?
    2 Au niveau du select, la tabulation n'est pas respecté entre les colonnes.
    3 apres le ## (le 2eme) j'ai un saut de 2 lignes ..?
    merci
    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
     
     
    SET embedded ON
    SET underline off
    SET pagesize 50
    SET termout off
    SET heading off
    SET heads ON
    SET linesize 2000 
    SET feedback off
    SET trimspool ON
     
     SPOOL U:\E-Agriciel\Sortie_plsql.csv
        prompt ##
        prompt ID_ARTICLE   ID_DOMAINE_DEPOT    QUANTITE    DATE_ACTIVITE   BOOL_TXT
        Prompt ##
     
     SELECT 
           CAST (PART_NO AS VARCHAR(30)) ||chr(9)||
           CAST (LOCATION_NO AS VARCHAR(30)) ||chr(9)||
           TO_CHAR(QTY_ONHAND,'9999990D9999') ||chr(9)||
           TO_CHAR(LAST_ACTIVITY_DATE , 'YYYYMMDD') ||chr(9)||
           DECODE (LOCATION_NO,'PEINTURE',1,0)
     
     FROM  INVENTORY_PART_IN_STOCK
     
     WHERE PART_NO = '735003'

Discussions similaires

  1. Concaténation de fichier csv avec entête
    Par MottetCCSF dans le forum Langage
    Réponses: 1
    Dernier message: 19/12/2007, 20h46
  2. [CSV] Affichage d'un fichier csv avec pagination
    Par arnoweb dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2006, 15h13
  3. [CSV] Générer un fichier CSV
    Par Taz_8626 dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 08h25
  4. [Excel] Générer des fichiers Excel avec PHP et des données SQL
    Par MaTHieU_ dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 29/03/2006, 15h46
  5. générer un fichier svg avec le bon encoding
    Par TOM-Z dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 24/08/2005, 17h39

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