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 :

Résultat de requête étrange ?


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut Résultat de requête étrange ?
    Bonjour à tous,

    la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WITH mq AS ( 
         SELECT /*+ MATERIALIZE */ 'USD' FROM DUAL
    )
    SELECT *
    FROM mq
    me retourne la chaîne : 'USD ' (USD + 6 espaces). Si j'enlève le hint, tout redevient normal. De même, l'insertion de ce résultat dans une table modifie le format de la colonne, et là je comprends plus rien :

    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
     
    CREATE TABLE IS_A_BUG (
           TEST_VAL VARCHAR2(3)
    )
     
    INSERT INTO IS_A_BUG 
    WITH mq AS ( 
         SELECT /*+ MATERIALIZE */ 'USD' FROM DUAL
    )
    SELECT *
    FROM mq
     
    COMMIT
     
    SELECT DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLS
    WHERE TABLE_NAME = 'IS_A_BUG'
    Le dernier select retourne un VARCHA2(9) ! ! Je me suis laissé dire que c'était un problème de charset : mon client (Toad ou PL/SQL dev sous XP) est en WE8MSWIN1252 et ma base en UTF8, je ne comprends pas le problème. Et comment un problème de charset peut arriver à modifier le format de ma table ?

    Voilà, si quelqu'un a une idée... ?
    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si vous utilisez unicode, la longueur de vos chaînes peut être exprimée soit en bits, soit en nombre de caractère.

    Pourquoi ? Parce qu'en UFT8 un caractère = deux octets.

    Vous êtes en 9i ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    Merci pour votre réponse. Oui, je suis en 9i... Mais je ne comprend pas tout ? Ok pour la description du type de la colonne en VARCHAR2(9) : mauvaise interprétation de ma part, 9 représentant la taille du champs en octets et non le nombre de caractères du champs.

    Mais quid du /*+ materialize */ qui concatène des espaces en fin de chaîne ?

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je n'arrive pas à reproduire ton exemple, mais qu'elle est ta valeur de cursor sharing???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH mq AS (SELECT /*+ MATERIALIZE */ 'USD' FROM DUAL)SELECT * FROM mq;
    ´US
    ---
    USD
    WITH mq AS (SELECT 'USD' FROM DUAL) SELECT * FROM mq;
    ´US
    ---
    USD
    sho parameter cursor_sharing
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- -------------
    cursor_sharing                       string      EXACT

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    Bonjour,

    cursor_sharing est à exact.

    Sous sqlplusw, le problème se matérialise (si je puis dire) différemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH mq AS (SELECT /*+ MATERIALIZE */ 'USD' VAL FROM DUAL) SELECT mq.VAL || '***'  AS MONTEST FROM mq;
     
    MONTES
    ------
    USD
     
    WITH mq AS (SELECT 'USD' VAL FROM DUAL) SELECT mq.VAL || '***'  AS MONTEST FROM mq;
     
    MONTES
    ------
    USD***
    Les résultats des posts précédents ont été obtenus sous PLSQL/Dev et Toad.

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Ca a l'air d'être un bug.

    Bon le hint MATERIALIZE n'est pas supporté, je doute donc qu'il soit de grand intérêt de contacter Oracle support...

    Quelle est ta version?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut
    Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production (sous AIX).

    Mince, je m'étonne d'être le premier à tomber sur un bug pareil ! ? Pour l'instant j'ai un contournement avec un trim() dans le subselect, en espérant que le problème ne ressurgisse pas ailleurs...

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Sur metalink il y a quelques bugs avec materialized et WITH

    Ex: Bug 5708633 - Wrong results / dump [ldxite] from materialized WITH clause

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944

Discussions similaires

  1. Résultats de requête étranges
    Par garheb dans le forum E-Business
    Réponses: 1
    Dernier message: 25/07/2011, 15h27
  2. Réponses: 7
    Dernier message: 26/09/2005, 17h50
  3. table comme résultat de requête
    Par nafnaf625 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2005, 11h51
  4. Comparaison de résultats de requêtes
    Par Nyx de Tours dans le forum Requêtes
    Réponses: 7
    Dernier message: 31/07/2004, 15h49
  5. Trier aléatoirement un résultat de requête
    Par ang36 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/01/2004, 17h38

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