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 Oracle Discussion :

Probleme Sqlplus trimspool/trim ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut Probleme Sqlplus trimspool/trim ?
    Hello les boys,

    J'essaie d'obtenir un affichage propre en effectuant ma requête sql et j'ai beau avoir tenté pas mal de choses ... le résultat est atroce !

    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 term off
    set colsep ";"
    set heading OFF
    set pagesize 0
    set linesize 250
    set numwidth 8
    set tab off
    set trimspool on
    set verify off
    set heading off
    set space 0
    set echo off
    set feedback off
    set trimout off
    set termout off
    SET HEADSEP off
     
    /* accept spoolfile prompt 'Ouput file name ==> ' */
     
    spool &1
     
    define var_table = 'PLW_CODE_ARRIMAGE';
     
    /* Check bool sur la table NETWORK et TASK */
    SELECT
            TRIM(SEQ_ARRIMAGE) AS SEQ_ARRIMAGE,
            TRIM(NO_PA) AS NO_PA,
            TRIM(LOT_DEBUT) AS LOT_DEBUT,
            TRIM(TYPE_DEBUT) AS TYPE_DEBUT,
            TRIM(SEQUENCE_DEBUT) AS SEQUENCE_DEBUT
    .......
    FROM PLW_CODE_ARRIMAGE;
     
    spool off
     
    prompt ===  Generated file : &1
     
    set head on
    set echo on
     
    quit;

    Nom : affichage.png
Affichages : 2663
Taille : 13,7 Ko

    Une idée svp ?

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    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 : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Il faut redéfinir la taille de test colonnes.

    Par exemple pour une colonne NOM varchar2(50) mais qui ne fait pas plus de 20, met
    col NOM format A20

    Pour une colonne NUMBER(10) de nom SALAIRE qui fait que 6 de long met
    col SALAIRE format 999999

    Essaye aussi de mettre linesize 150 seulement, c'est une longueur standard sous SQL*Plus.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Merci pour ta réponse ! Oui linesize j'ai tenté plusieurs valeurs pour vérifier que l'erreur ne venait pas de la.

    La première colonne visible avec ..._PA correspond à un varchar 15 et pourtant j'ai un espace devant ...

    Pour décrire précisément le besoin que j'ai : je souhaite faire un SQL qui prend deux arguments le fichier et le nom de la table. Le script sera ensuite appelé dans un KSH ... Dans le code transmis j'ai mis en dur une table ainsi que TRIM() mais il ne s'agit pas du format cible que je souhaite obtenir.

    Si vous avez des idées ...

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    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 : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Je te conseille de repartir du tout tout début.

    Etape 1 : tu enlèves TOUS les paramètres renseignés avec SET en début de script

    Etape 2 : sous SQL*Plus fait un show all pour voir les valeurs de tes variables d'environnement; peut-être que certaines sont mal renseignées mais là, c'est à toi de voir

    Etape 3 : tu lances sous SQL*Plus un SELECT tout bête avec le nom de la première colonne sans TRIM et tu vois si le résultat est OK.
    Etape 3.5 S'il est OK, tu rajoutes TRIM et si c'est toujours OK tu ajoutes les autres colonnes une par une... : il faut y aller étape par étape.
    S'il est KO, il faut corriger l'erreur avant de passer à la colonne 2

    Etape 4 : une fois que sous SQL*Plus l'affichage est OK, tu fais un spool et ensuite tu affiches son contenu et on verra si c'est OK à nouveau.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    Résultat du show all :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    appinfo is OFF and set to "SQL*Plus"
    arraysize 15
    autocommit OFF
    autoprint OFF
    autorecovery OFF
    autotrace OFF
    blockterminator "." (hex 2e)
    btitle OFF and is the first few characters of the next SELECT statement
    cmdsep OFF
    colinvisible OFF
    colsep " "
    compatibility version NATIVE
    concat "." (hex 2e)
    copycommit 0
    COPYTYPECHECK is ON
    define "&" (hex 26)
    describe DEPTH 1 LINENUM OFF INDENT ON
    echo OFF
    editfile "afiedt.buf"
    embedded OFF
    errorlogging is OFF
    escape OFF
    escchar OFF
    exitcommit ON
    FEEDBACK ON for 6 or more rows
    flagger OFF
    flush ON
    fullcolname OFF
    heading ON
    headsep "|" (hex 7c)
    history is OFF
    instance "toto"
    linesize 80
    lno 14
    loboffset 1
    lobprefetch 0
    logsource ""
    long 80
    longchunksize 80
    newpage 1
    null ""
    numformat ""
    numwidth 10
    pagesize 14
    PAUSE is OFF
    pno 0
    recsep WRAP
    recsepchar " " (hex 20)
    release 1202000100
    repfooter OFF and is NULL
    repheader OFF and is NULL
    rowprefetch 1
    securedcol is OFF
    serveroutput OFF
    shiftinout INVISIBLE
    showmode OFF
    spool OFF
    sqlblanklines OFF
    sqlcase MIXED
    sqlcode 0
    sqlcontinue "> "
    sqlnumber ON
    sqlpluscompatibility 12.2.0
    sqlprefix "#" (hex 23)
    sqlprompt "SQL> "
    sqlterminator ";" (hex 3b)
    statementcache is 0
    suffix "sql"
    tab ON
    termout ON
    timing OFF
    trimout ON
    trimspool OFF
    ttitle OFF and is the first few characters of the next SELECT statement
    underline "-" (hex 2d)
    USER is "ORA_CASH"
    verify ON
    wrap : lines will be wrapped
    xmloptimizationcheck OFF
    Etape 3 :

    L'affichage n'est pas correcte. En enlevant l'entête j'ai toujours les blancs correspondant à ma valeur 255 qui restent.

    Nom : print_dev.png
Affichages : 2635
Taille : 9,2 Ko
    Nom : print_dev2.png
Affichages : 2621
Taille : 23,7 Ko


    Je ne peux réduire la taille de ma colonne ne pouvant être sur que ma valeur sera inférieur à telle ou telle critère.
    Je ne peux pas faire de TRIM de FORMAT column sachant que je vous ai décris mon besoin.

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    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 : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Mais il y a quoi dans ce champ TYPE_DEBUT? Visiblement c'est entièrement vide...

    J'ai l'impression que ta table est renseignée n'importe comment par les programmes qui insèrent les données, c'est pour ça que tu es obligé de faire des TRIM?
    Le plus propre, mais pas le plus simple je pense, serait de voir les développeurs pour qu'ils revoient leur programme car là tu as un dépotoir de données et pas une base de données
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Le problème vient de tes champs "longs" pour lesquels sqlplus affiche la taille maximale possible
    Tu peux peut-être t'en sortir avec les instructions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set lines 20000
    set trims on
    A l'écran, je ne te garantie pas que le visuel sera correct (tout dépend de l'outil que tu utilises pour afficher les données, ce dernier produira peut-être une retour à la ligne pour afficher toutes les données à l'écran sans ascenseur horizontal)
    Par contre dans ton fichier, via le spool, tu devrais avoir toutes tes infos sur une seule ligne (à condition qu'une ligne ne dépasse pas 20000 caractères)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Points : 52
    Points
    52
    Par défaut
    J'ai retourné les dernières lignes du SELECT et je travail sur un environnement de développement avec un jeu de données pas forcement clean.

    Toutes les lignes ne sont pas vides mais le champ peut contenir des values assez longues (je n'ai par ailleurs pas la main sur les tables).

    PS : Le trim ne change absolument pas le résultat obtenu à l'écran ...

    Quentin.

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Il faut que LINESIZE ait une valeur au moins égale à la somme de la longueur des différents champs sélectionnés.

    Rien que pour TYPE_DEBUT (ou trim(TYPE_DEBUT), ça sera pareil), il faut déjà prévoir 256 caractères.
    Si vous faites un formatage explicite par COLUMN TYPE_DEBUT FORMAT A80, il n'en faudra plus que 80.

    Donc dans votre cas, il faut une valeur très large pour LINESIZE, disons 2000.

    SET TRIMSPOOL ON permettra d'éviter que des espaces soient ajoutés inutilement en fin de ligne à concurrence du LINESIZE.
    C'est à dire que si la somme des longueurs des champs n'est que de 1500, et que LINESIZE vaut 2000, on va éviter d'avoir 500 espaces ajoutés dans le fichier SPOOL à la fin de chaque ligne.

    Edit : Je viens de voir qu'entre temps, Scriuiw disait, dans le principe, la même chose.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/04/2008, 13h35
  2. probleme avec sqlPLUS
    Par jib2b dans le forum Sql*Plus
    Réponses: 0
    Dernier message: 29/02/2008, 20h18
  3. Réponses: 3
    Dernier message: 12/09/2007, 10h52
  4. Probleme de connexion SQLPLUS
    Par llsn dans le forum Sql*Plus
    Réponses: 2
    Dernier message: 28/08/2006, 12h28
  5. Java Probleme avec line.trim().split("\t");
    Par benzh dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2006, 04h18

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