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 :

Concaténation de plusieurs espaces chr(32), n'affiche qu'un seul espace chr(32) en sortie sur vue matérielle


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 8
    Points
    8
    Par défaut Concaténation de plusieurs espaces chr(32), n'affiche qu'un seul espace chr(32) en sortie sur vue matérielle
    Hello à tous,

    Je vous expose mon problème, qui semble tout bête à première vue mais qui m'enquiquine quelque peu:


    J'ai créé une vue matérielle (FIXALARMS_MV) à partir d'une table appelée FIXALARMS.

    Script de construction de la table FIXALARMS :
    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
     
    DROP TABLE IFIXEVENTWRITER.FIXALARMS CASCADE CONSTRAINTS;
     
    CREATE TABLE IFIXEVENTWRITER.FIXALARMS
    (
      ALM_NATIVETIMELAST  DATE,
      ALM_DATELAST        VARCHAR2(12 BYTE),
      ALM_TIMELAST        VARCHAR2(15 BYTE),
      ALM_LOGNODENAME     VARCHAR2(10 BYTE),
      ALM_PHYSLNODE       VARCHAR2(10 BYTE),
      ALM_TAGNAME         VARCHAR2(30 BYTE),
      ALM_ALMSTATUS       VARCHAR2(9 BYTE),
      ALM_VALUE           VARCHAR2(40 BYTE),
      ALM_ALMEXTFLD1      VARCHAR2(80 BYTE),
      ALM_MSGTYPE         VARCHAR2(11 BYTE),
      ALM_DESCR           VARCHAR2(480 BYTE),
      ALM_ALMPRIORITY     VARCHAR2(10 BYTE),
      ALM_ALMAREA         VARCHAR2(500 BYTE),
      ALM_ALMEXTFLD2      VARCHAR2(80 BYTE),
      ALM_OPNAME          VARCHAR2(32 BYTE),
      ALM_OPFULLNAME      VARCHAR2(80 BYTE),
      ALM_OPNODE          VARCHAR2(10 BYTE),
      ALM_MSGID           VARCHAR2(128 BYTE),
      ALM_NATIVETIMEIN    DATE,
      ALM_DATEIN          VARCHAR2(12 BYTE),
      ALM_TIMEIN          VARCHAR2(15 BYTE),
      ALM_TAGDESC         VARCHAR2(40 BYTE),
      ALM_UNIT            VARCHAR2(13 BYTE),
      ALM_PERFNAME        VARCHAR2(32 BYTE),
      ALM_PERFFULLNAME    VARCHAR2(80 BYTE),
      ALM_PERFBYCOMMENT   VARCHAR2(170 BYTE),
      ALM_VERNAME         VARCHAR2(32 CHAR),
      ALM_VERFULLNAME     VARCHAR2(80 BYTE),
      ALM_VERBYCOMMENT    VARCHAR2(170 BYTE),
      ID                  NUMBER GENERATED ALWAYS AS IDENTITY ( START WITH 6347841 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER NOKEEP) NOT NULL
    )
    TABLESPACE USERS
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    MONITORING;
     
    CREATE UNIQUE INDEX IFIXEVENTWRITER.FIXALARMS_ID_PK ON IFIXEVENTWRITER.FIXALARMS
    (ID)
    LOGGING
    TABLESPACE USERS
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               );
     
    ALTER TABLE IFIXEVENTWRITER.FIXALARMS ADD (
      CONSTRAINT FIXALARMS_ID_PK
      PRIMARY KEY
      (ID)
      USING INDEX IFIXEVENTWRITER.FIXALARMS_ID_PK
      ENABLE VALIDATE);
    La vue matérielle se construit comme suit:

    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
     
    DROP MATERIALIZED VIEW IFIXEVENTWRITER.FIXALARMS_MV ;
     
    CREATE MATERIALIZED VIEW IFIXEVENTWRITER.FIXALARMS_MV
    PCTFREE 0
    TABLESPACE USERS
    STORAGE (INITIAL 64K)
    BUILD IMMEDIATE
    REFRESH FAST
    ON COMMIT WITH PRIMARY KEY
    DISABLE QUERY REWRITE
    AS SELECT 
    ID AS ID,
    ALM_NATIVETIMELAST AS NATIVETIMELAST,
    ALM_LOGNODENAME AS LOGNODENAME,
    ALM_ALMEXTFLD1 AS CRITICALITY,
    ALM_DATELAST || chr(32) || Substr(ALM_TIMELAST,1,10)||  chr(32) || RPAD(ALM_LOGNODENAME, 8,  chr(32)) || chr(32)|| RPAD(ALM_TAGNAME,30,  chr(32)) || chr(9) ||RPAD(ALM_ALMSTATUS, 9, chr(32)) || chr(9) || RPAD(ALM_VALUE, 13,  chr(32)) || chr(9) || ALM_DESCR  AS ALMTEXT
    FROM IFIXEVENTWRITER.FIXALARMS
    ORDER BY ID DESC; 
     
    CREATE INDEX IFIXEVENTWRITER.I_FIXALARMS3_MV ON IFIXEVENTWRITER.FIXALARMS3_MV (NATIVETIMELAST, LOGNODENAME);
    Mon problème reside au niveau des fonction "RPAD".

    Exemple avec RPAD(ALM_LOGNODENAME, 8, chr(32)) :
    Si le texte contenu dans ALM_LOGNODENAME est de de 6 caractères (123456), la valeur retournée devrait être "123456 " avec 2 espaces à droite.
    Or, il me retourne "123456 " (1 seul espace est present)

    Mon problème est donc le suivant: Les informations ne s'alignent pas correctement:
    Nom : pb alignement.png
Affichages : 424
Taille : 66,5 Ko

    J'ai essayé de remplacer le chr(32) par un chr(160), et là aucun problème. Le texte est bien aligné.

    Je ne comprends donc pas l'origine du problème: Paramètrage de la colonne de la DB, Problème avec le NLS_LANG (pour info, j'utilise : FRENCH_SWITZERLAND.WE8MSWIN1252), ...

    Si vous avez la moindre idée, je suis preneur.

    Merci par avance

    Bien cordialement,

    Forfelet

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il n'y aurait pas un soucis entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ....
     ALM_LOGNODENAME     VARCHAR2(10 BYTE),
     ....
     RPAD(ALM_LOGNODENAME, 8,  chr(32))
     ....

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    1. Il faut voir le jeu de caractères de votre base de données, créer en varchar2(x byte) ça peut réserver des surprises.
    Je vous conseille plutôt des varchar2(x char).

    2. Comme skuatamad vous l'indique, vous avez un soucis, si vos données dépassent 8 caractères, le rpad va vous les tronquer.
    Le plus simple ça reste de faire une petite requête directement sur votre table, sur les lignes problématiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select '#' || rpad(ALM_LOGNODENAME, 8, ' ') || '#'
      from IFIXEVENTWRITER.FIXALARMS
     where ...;
    3. Pour votre problème d'alignement... utilisez-vous bien une police à chasse fixe comme "Courier New" ?
    De ce que je vois ça peut être le problème.

    4. Pourquoi une vue matérialisée ?
    Pour une simple concaténation, une vue simple fait ça très bien.
    Ou même une colonne virtuelle si vous êtes au moins en 11g.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    @skuatamad : Oui en effet, j'aurais pu faire ma recherché sur les 10 caractères possibles. Cependant, je sais qu'au maximum, le texte renseigné dans la colonne ALM_LOGNODENAME ne dépassera pas 8 caractères.
    Evidemment, meme avec RPAD(ALM_LOGNODENAME, 10, chr(32)), ça ne corrige pas mon problème.


    @Waldar :
    1. Il faut voir le jeu de caractères de votre base de données, créer en varchar2(x byte) ça peut réserver des surprises.
    Pour être complet, la table FIXALARMS a été créée par un software (GE-iFIX), c'est un logiciel de supervision. Cette table est rensignée par ce soft et permet de recueillir les logs de ma supervision. Je ne peux donc pas en théorie toucher aux paramètrage des colonnes. Mais j'ai quand meme fait le test pour éliminer toute hypothèse... ça ne marche pas mieux

    2. Voir réponse @skuatamad plus haut

    3. Pour votre problème d'alignement... utilisez-vous bien une police à chasse fixe comme "Courier New" ?
    Oui, évidemment. C'est une des premières choses que j'ai regardé... j'avais déjà été embêté avec ce genre de pb avec du php, il y a qq temps.

    4. Pourquoi une vue matérialisée ?
    Tout simplement par ce que je ne suis qu'au début de la création de cette vue matérielle, les requêtes que je vais devoir implementer dans le futur sont qq peu plus complexes que cette pauvre concatenation.

    Merci pour vos suggestions.

    A+
    Forfelet

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ok pour vos réponses, je reviens sur celle-ci :
    Citation Envoyé par forfelet Voir le message
    Oui, évidemment. C'est une des premières choses que j'ai regardé... j'avais déjà été embêté avec ce genre de pb avec du php, il y a qq temps.
    Car sur votre image, ce n'est pas une police à chasse fixe :
    Nom : Font_Source.png
Affichages : 384
Taille : 5,0 Ko
    Voici en Courier New :
    Nom : Font_Chasse_Fixe.png
Affichages : 364
Taille : 2,0 Ko

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    Hello,

    @Waldar: Merci pour ta remarque. Elle m'a permis de me rendre compte qu'en fait le problème se trouve sur mon interface et non sur ma base Oracle.

    Sur mon interface, je ne fais pourtant qu'un Select de ma vue matérielle (affichage en font Courier New), et je perds mon alignement (voir ci-dessous). Mais en faisant ce Select directement depuis Toad par exemple, j'ai un bon alignement.

    Depuis mon interface:
    Nom : print.png
Affichages : 409
Taille : 102,8 Ko

    Depuis Toad:
    Nom : print2.png
Affichages : 371
Taille : 13,1 Ko

    Je pense donc que je peux mettre ce sujet en résolu.

    Merci pour votre aide.

    A+
    Forfelet

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

Discussions similaires

  1. [AJAX] Transmettre plusieurs valeurs et les r'afficher.
    Par univscien dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 16/03/2008, 14h24
  2. Concaténation de plusieurs Espaces ou Tab
    Par tizilfin dans le forum Linux
    Réponses: 2
    Dernier message: 11/10/2007, 11h54
  3. [D7][BDE]Concaténation de plusieurs tables
    Par fthdz dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/04/2007, 22h36
  4. plusieurs choix pour un formulaire affiche
    Par geay dans le forum Access
    Réponses: 12
    Dernier message: 06/10/2006, 15h06
  5. Concaténation de plusieurs champs dans un objet
    Par bastoonet dans le forum Débuter
    Réponses: 3
    Dernier message: 27/09/2006, 11h13

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