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

Sql*Plus Oracle Discussion :

Séparateur de champs avec export csv et sous-requête [10gR2]


Sujet :

Sql*Plus Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 82
    Points
    82
    Par défaut Séparateur de champs avec export csv et sous-requête
    Bonjour à tous,

    J'ai cette requête qui est exécuté dans un script python (avec sqlplus)
    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
    SET TRIMSPOOL ON 
     SET TRIMOUT ON 
     SET HEAD OFF 
     SET HEADING OFF 
     SET HEADSEP OFF 
     SET FEEDBACK OFF 
     SET ECHO OFF 
     SET PAGESIZE 0 
     SET TAB OFF 
     SET LINESIZE 1000 
     SET TERMOUT OFF 
     
     spool """ + fileSrc + """
     SELECT * FROM
     (
             SELECT /* + FIRST_ROWS(n) */ t.*, ROWNUM rnum FROM
             (
                     SELECT a.tbl_0||'|'||a.evt_0||'|'||TO_CHAR(a.dat_0, 'dd-mm-yyyy')||'|'||a.hou_0||'|'||a.id1_0||'|'||a.id2_0||'|'||a1.col_0||'|'||a1.nval_0||'|'||a.seq_0                                                                  
                     FROM XXXXX.audith a
                     INNER JOIN XXXXX.auditl a1 ON a1.seq_0 = a.seq_0
                     WHERE
                             (a.tbl_0 = 'SORDER' OR
                             a.tbl_0 = 'SORDERP' OR
                             a.tbl_0 = 'SORDERQ' OR
                             a.tbl_0 = 'SDELIVERY' OR
                             a.tbl_0 = 'SDELIVERYD' OR
                             a.tbl_0 = 'SINVOICE' OR
                             a.tbl_0 = 'SINVOICEV' OR
                             a.tbl_0 = 'OPPOR' OR
                             a.tbl_0 = 'SALESREP') AND
                             TO_CHAR(a.dat_0, 'dd-mm-yyyy') = TO_CHAR(sysdate, 'dd-mm-yyyy')
                     ORDER BY a.HOU_0 ASC
             ) t
             WHERE ROWNUM <= 100000)
     WHERE rnum >= 11984;
     spool off
     exit
    Le résultat est écrit dans un fichier csv. Tout marche sauf que j'ai un problème au niveau du séparateur. Dans ma sous-sous-requête j'utilise volontairement le | comme séparateur. Mais en l'état la requête m'écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDELIVERY|UPDATE|23-02-2022|140949|LIVHIL22022344| |CFMFLG|2|437211
         23085
    Alors que je moi je souhaite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDELIVERY|UPDATE|23-02-2022|140949|LIVHIL22022344| |CFMFLG|2|437211|23085
    J'ai essayé de modifier mettre set colsep '|' mais cela ne change rien. Dans le second select j'ai modifier le séparateur comme dans le 3eme select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT /* + FIRST_ROWS(n) */ t.*||'|'||ROWNUM rnum FROM
    J'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	SELECT /* + FIRST_ROWS(n) */ t.*||'|'||ROWNUM rnum FROM
    	                                *
    ERROR at line 3:
    ORA-00923: FROM keyword not found where expected
    Je vois pas trop comment faire pour avoir le même séparateur quelques soit le niveau de select et que chaque résultat soit sur une ligne ?

    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 000
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 000
    Points : 2 501
    Points
    2 501
    Par défaut
    Le message d'erreur est normal car tu veux concaténer N colonnes, renvoyées par *, avec |; il faut le faire colonne par colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT /* + FIRST_ROWS(n) */ t.*||'|'||ROWNUM rnum FROM
    	                                *
    ERROR at line 3:
    ORA-00923: FROM keyword not found where expected
    Pour le retour à la ligne, c'est certainement parce que le résultat du "SELECT /* + FIRST_ROWS(n) */ t.*" te renvoie une chaîne de caractère AVEC un retour à la ligne puis tu ajoutes le ROWNUM qui est à la suite.
    Question : toutes les lignes ont ce pb ou seulement la dernière, celle avec le ROWNUM de 23085?

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 82
    Points
    82
    Par défaut
    Question : toutes les lignes ont ce pb ou seulement la dernière, celle avec le ROWNUM de 23085?
    Toutes les lignes sont concernées.

    Du coup j'ai transformé ma requête est c'est mieux
    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
     SELECT * FROM
     (
             SELECT /* + FIRST_ROWS(n) */ t.tbl_0||'|'||t.evt_0||'|'||t.dat_0||'|'||t.hou_0||'|'||t.id1_0||'|'||t.id2_0||'|'||t.col_0||'|'||t.nval_0||'|'||t.seq_0||'|'||ROWNUM rnum
             FROM (
                     SELECT a.tbl_0,a.evt_0,TO_CHAR(a.dat_0, 'dd-mm-yyyy') dat_0,a.hou_0,a.id1_0,a.id2_0,a1.col_0,a1.nval_0,a.seq_0
                     FROM XXXXX.audith a
                     INNER JOIN XXXXX.auditl a1 ON a1.seq_0 = a.seq_0
                     WHERE
                             (a.tbl_0 = 'SORDER' OR
                             a.tbl_0 = 'SORDERP' OR
                             a.tbl_0 = 'SORDERQ' OR
                             a.tbl_0 = 'SDELIVERY' OR
                             a.tbl_0 = 'SDELIVERYD' OR
                             a.tbl_0 = 'SINVOICE' OR
                             a.tbl_0 = 'SINVOICEV' OR
                             a.tbl_0 = 'OPPOR' OR
                             a.tbl_0 = 'SALESREP') AND
                             TO_CHAR(a.dat_0, 'dd-mm-yyyy') = TO_CHAR(sysdate, 'dd-mm-yyyy')
                     ORDER BY a.HOU_0 ASC
             ) t
             WHERE ROWNUM <= 100000)
     WHERE rnum >= 33794;
    Maintenant j'ai comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE rnum >= 33794
          *
    ERROR at line 22:
    ORA-01722: invalid number

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 110
    Points : 28 450
    Points
    28 450
    Par défaut
    Bonjour,

    Si tu relis bien ta requête, tu constateras que rnum est la concaténation de toutes tes colonnes ce qui, en effet, ne peut pas représenter un nombre valide.

    Une manière de s'en sortir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  colonnes || '|' || rnum
    FROM    (   SELECT  /* + FIRST_ROWS(n) */ 
                        tbl_0 || '|' || evt_0 || '|' || dat_0 || '|' || hou_0 || '|' || id1_0 || '|' || id2_0 || '|' || col_0 || '|' || nval_0 || '|' || seq_0 AS colonnes
                    ,   ROWNUM  AS rnum
                FROM    (
                        ...         
                        )   valeurs
                WHERE   ROWNUM <= 100000
            )   liste
    WHERE   rnum >= 33794
    ;

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 000
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 000
    Points : 2 501
    Points
    2 501
    Par défaut
    Le message d'erreur est normal.
    Quand tu fais SELECT /* + FIRST_ROWS(n) */ t.tbl_0||'|'||t.evt_0||'|'||t.dat_0||'|'||t.hou_0||'|'||t.id1_0||'|'||t.id2_0||'|'||t.col_0||'|'||t.nval_0||'|'||t.seq_0||'|'||ROWNUM rnum que vaux rnum?
    Eh bien c'est TOUTE la chaine de caractère et pas que ROWNUM puisque rnum concerne tout ce qui est devant la virgule précédente et là il n'y en a pas, donc c'est une chaîne de caractère, pas un nombre.

    al1_24, tu m'as grillé de deux minutes...

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 82
    Points
    82
    Par défaut
    C'est nikel cela marche comme vous me l'avez proposé.

    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
    40
    41
    SET TRIMSPOOL ON 
     SET HEAD OFF 
     SET HEADING OFF 
     SET HEADSEP OFF 
     SET FEEDBACK OFF 
     SET ECHO OFF 
     SET PAGES 0
     SET PAGESIZE 0 
     SET TAB OFF 
     SET LINESIZE 1000                                                                                                                                                                                                                         
     SET TERMOUT OFF
     SET COLSEP |
     
     spool """ + fileSrc + """
     SELECT colonnes||'|'||rnum FROM
     (
             SELECT 
                     /* + FIRST_ROWS(n) */ 
                     t.tbl_0||'|'||t.evt_0||'|'||t.dat_0||'|'||t.hou_0||'|'||t.id1_0||'|'||t.id2_0||'|'||t.col_0||'|'||t.nval_0||'|'||t.seq_0 colonnes,
                     ROWNUM rnum
             FROM (
                     SELECT a.tbl_0,a.evt_0,TO_CHAR(a.dat_0, 'dd-mm-yyyy') dat_0,a.hou_0,a.id1_0,a.id2_0,a1.col_0,a1.nval_0,a.seq_0
                     FROM XXXX.audith a
                     INNER JOIN XXXX.auditl a1 ON a1.seq_0 = a.seq_0
                     WHERE
                             (a.tbl_0 = 'SORDER' OR
                             a.tbl_0 = 'SORDERP' OR
                             a.tbl_0 = 'SORDERQ' OR
                             a.tbl_0 = 'SDELIVERY' OR
                             a.tbl_0 = 'SDELIVERYD' OR
                             a.tbl_0 = 'SINVOICE' OR
                             a.tbl_0 = 'SINVOICEV' OR
                             a.tbl_0 = 'OPPOR' OR
                             a.tbl_0 = 'SALESREP') AND
                             TO_CHAR(a.dat_0, 'dd-mm-yyyy') = TO_CHAR(sysdate, 'dd-mm-yyyy')
                     ORDER BY a.HOU_0 ASC
             ) t
             WHERE ROWNUM <= 100000) /* MAX */
     WHERE rnum >= 1; /* MIN */
     spool off
     exit
    Merci.

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

Discussions similaires

  1. [V10] Déclaration d'un champs - Import/Export CSV
    Par KevinH dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 04/06/2019, 09h50
  2. Réponses: 1
    Dernier message: 22/07/2015, 19h03
  3. [DisplayTag] Modifier le séparateur lors de l'export CSV
    Par ahlem83 dans le forum Taglibs
    Réponses: 2
    Dernier message: 21/10/2011, 16h18
  4. Réponses: 1
    Dernier message: 16/09/2009, 13h30
  5. Suppression avec condition de type sous-requête
    Par matel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/09/2008, 08h24

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