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 :

conversion char -> float


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut conversion char -> float
    J'aimerais créer une vue en récupérant certains champs d'une table mais j'aimerais convertir l'un d'entre eux de type 'char(16)' en 'float'.

    MyTable (..., montant char(16), ...)
    ->
    MyView(..., montant float,...)

    J'ai essayé d'utiliser la fonction to_number (cf. ci-dessous) mais je rencontre ensuite des problèmes au niveau du type de données sous Business Objects. Existe-il une fonction du style "to_float" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE VIEW MY_VIEW
    (..., MONTANT, ...)
    AS 
    select
       ...,
       to_number(montant) montant,
       ,
       ...  
    from MY_TABLE
    /
    Merci.

  2. #2
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    to_number(char) te retournera un NUMBER. Si tu veux le transformer en quelque chose d'autre, tu peux employer cast.

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL> create or replace view v as select to_number('1.2') n1, 
    cast(to_number('1.2') as float) n2 from dual;
     
    View created.
     
    SQL> desc v
     Name              Null?    Type
     ----------------- -------- ------------
     N1                         NUMBER
     N2                         FLOAT(38)

  3. #3
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    J'ai essayé d'utiliser cast(to_number(...) as float). Mais une fois la vue créée, quand je fais un 'desc', on m'indique que le champ de la vue est toujours de type number...
    Pour info, ma version d'oracle est la 8.1.7.4.
    Auriez-vous une idée?
    Merci.

  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
    Points : 4 926
    Points
    4 926
    Par défaut
    autre que CAST, non. je n'ai pas de 8i pour essayer

  5. #5
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par laurentschneider
    autre que CAST, non. je n'ai pas de 8i pour essayer
    si j'y pense, j'essayerai lundi, quand j'aurai une 8i sous la main

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par laurentschneider
    si j'y pense, j'essayerai lundi, quand j'aurai une 8i sous la main
    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
    8i CYRIL> select banner from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
    PL/SQL Release 8.1.7.4.0 - Production
    CORE    8.1.7.0.0       Production
    TNS for Linux: Version 8.1.7.4.0 - Production
    NLSRTL Version 3.4.1.0.0 - Production
     
    5 ligne(s) sélectionnée(s).
     
    8i CYRIL> create or replace view v as select to_number('1.2') n1,
      2  cast(to_number('1.2') as float) n2 from dual;
     
    Vue créée.
     
    8i CYRIL> desc v;
     Nom                            Null ?    Type
     ------------------------------- -------- ----
     N1                                       NUMBER
     N2                                       NUMBER
     
    8i CYRIL>
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  7. #7
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    En fait, j'ai un problème par rapport aux fonctions to_number ou cast.

    Depuis mon poste, que ce soit par sqlplus ou toad, la vue est bien créée et je peux ensuite faire un select dessus. En revanche depuis le poste de certains de mes collègues on peut créer cette meme vue mais un select genère une erreur oracle "ORA-01722: invalid number"...Est-ce que cela pourrait provenir du client oracle au niveau de la variable NLS_LANG distincte selon les postes?

    De plus, quand on crée une table selon le modèle de la vue avec le champ montant de type number et que l'on fait ensuite un "insert into select..." qui utilise les fonctions to_number ou cast pour récupérer la valeur "montant" correspondante de type char(16) d'une table, cela fonctionne sur les différents postes.

    Merci.

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Tu dois avoir une différence d'interprétation de la virgule d'un client à un autre, c'est ça qui fait planter. C'est sans doute dû au NLS_LANG effectivement (enfin je crois )

    pour stabiliser l'histoire, tu peux etre plus précis dans le to_number, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    create or replace view v as 
    select to_number ('1.2','999999999.999999999','NLS_NUMERIC_CHARACTERS = '',.''') n1 
    from dual

  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
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par remi4444
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    to_number ('1.2','999999999.999999999','NLS_NUMERIC_CHARACTERS = '',.''')
    ça ne sert à rien de préciser NLS_NUMERIC_CHARACTERS si tu n'as pas de D ni de G dans ton format.

    tu fais soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    to_number(:n,'9999999999.99999999')
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    to_number(:n,'9999999999D99999999','NLS_NUMERIC_CHARACTERS='',.'''=

  10. #10
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Quand j'utilise la fonction to_number(:n) cela fonctionne sur mon poste mais pas forcément sur un autre donc c'est pourquoi je pense que c'est une bonne idée de préciser le format avec to_number(:n,'9999999999.99999999') ou to_number(:n,'9999999999D99999999','NLS_NUMERIC_CHARACTERS='',.''')
    Le problème c'est que j'ai essayé avec différents formats mais il me génère a chaque fois l'erreur oracle "ORA-01722: Nombre non valide"...

    Merci.

  11. #11
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    avec quel nombre :

  12. #12
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Apparemment le probleme provient de la valeur de la chaine de caractères récupérée. C'est un char(16) et donc la valeur est de la forme '12,34 ' ou encore ',78 ' (avec des espaces)
    J'ai donc essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select 
    to_number ( 
    		  to_char(',78             ', '999999999999999D9999999999999999'),
    		  '999999999999999D9999999999999999',
    		  'NLS_NUMERIC_CHARACTERS='',.'''
    		  )
    montant
    from dual
    afin de "formater" ma chaine de caractère avant de la convertir.
    Cela fonctionne sur mon poste mais pas sur celui de ma collègue...

  13. #13
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    enlève le to_char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> select to_number(',78','999999999999999D9999999999999999',
    'NLS_NUMERIC_CHARACTERS='',.''') montant  from dual;
       MONTANT
    ----------
           .78

  14. #14
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Non le to_char est indispensable du fait des espaces situés dans la chaine de caractères : ',78 ' puisque c'est un char(16).
    Sinon cela retourne une erreur oracle.

  15. #15
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    En fait j'ai essayé de modifier dans le registre de la machine de mon collègue ou cela pose problème la valeur du character set du client oracle (HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0->NLS_LANG)
    En fait, lui a comme valeur "AMERICAN_AMERICA.WE8ISO8859P1" alors que moi "FRENCH_FRANCE.WE8ISO8859P1". J'ai fait un test sur sa machine avec "FRENCH_FRANCE.WE8ISO8859P1" comme character set et cela fonctionne.
    Est-ce que l'on peut préciser cela lors de l'utilisation de la vue?
    Merci.

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par divail
    Non le to_char est indispensable du fait des espaces situés dans la chaine de caractères : ',78 ' puisque c'est un char(16).
    Sinon cela retourne une erreur oracle.
    C'est là qu'il y a un problème alors. Rends toi compte que lorsque tu fais un to_char d'une chaine, étant donné que ton to_char attend en entrée un nombre, oracle va donc faire une conversion implicite en nombre de ta chaine avant de la passer dans ton to_char.

    si tu fait oracle exécute en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_char(to_number(',78             '))
    Et donc on retombe sur le même problème du to_number....

    vive les conversions implicites!

  17. #17
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par divail
    Est-ce que l'on peut préciser cela lors de l'utilisation de la vue?
    C'est précisément à ça que servent les paramètres NLS des to_char et des to_number.....

  18. #18
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Le problème c'est que ce sont les variables NLS_LANGUAGE and NLS_TERRITORY qui sont en cause. Or celles-ci ne peuvent pas être utilisées dans les fonctions SQL...(seulement par exemple via ALTER SESSION SET NLS_LANGUAGE = FRENCH NLS_TERRITORY = FRANCE

  19. #19
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    ton premier problème, c'est ton TO_CHAR('string') qui est bidon.

    ensuite, NLS_TERRITORY n'a d'influence que par NLS_NUMERIC_CHARACTERS, qui peut être employer dans to_number

  20. #20
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Ok mais si je n'utilise pas le to_char et que je fais un to_number de ',89 ' (avec des espaces) j'obtiens une erreur oracle.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Conversion de char en float
    Par mansgueg dans le forum C++
    Réponses: 2
    Dernier message: 08/03/2011, 12h56
  2. conversion char wide char
    Par ep31 dans le forum MFC
    Réponses: 4
    Dernier message: 15/11/2005, 08h14
  3. Pb Invalid Conversion "char" to "char*"
    Par kazarn dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2005, 13h24
  4. Conversion char * vers wchar_t
    Par Zapan dans le forum C++
    Réponses: 4
    Dernier message: 24/02/2005, 15h56
  5. Réponses: 3
    Dernier message: 26/05/2004, 23h03

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