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 :

Vue Oracle et to_number


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Par défaut Vue Oracle et to_number
    Bonjour à tous,

    Je vous expose un problème rencontré que je n'arrive pas à résoudre.

    Je crée une vue Oracle (sous Oracle 11g) à partir d'une table avec une colonne que je suis obligé de convertir en numérique pour des raisons de compatibilité entre plusieurs applis donc je fais un :

    CREATE VIEW ma_vue (v_col_num)
    AS SELECT to_number(t_col_varchar) FROM ma_table WHERE EstNumerique(t_col_varchar)=1
    EstNumerique étant une fonction me permettant d'exclure d'éventuelles données non numérique dans ma table d'origine

    Jusque là tout va bien (la colonne v_col_num étant bien en format numérique)

    Si je fais un :

    SELECT * FROM ma_vue
    pas de problème mes données sont OK

    par contre dés que je fais un :

    SELECT * FROM ma_vue WHERE v_col_num=99999
    J'ai une erreur ORA-01722: Nombre non valide

    Je précise que la syntaxe

    SELECT * FROM ma_vue WHERE v_col_num='99999'
    renvoit la même erreur.

    Je ne vois vraiment pas où ça coince mais j'ai sûrement loupé quelque chose.

    Merci d'avance pour votre aide.

    NM

  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
    Tout simplement parce que cette requête-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
      FROM ma_vue
     WHERE v_col_num = 99999
    Est transformée par Oracle en ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT to_number(t_col_varchar)
      FROM ma_table
     WHERE EstNumerique(t_col_varchar) = 1
       AND to_number(t_col_varchar) = 99999
    L'ordre des filtres dans le where n'est pas garanti.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Par défaut
    Merci pour votre réponse mais du coup je ne comprends pas pourquoi cela coince puisque le where devrait exclure les valeurs non numériques non ?

    Du coup y'a t'il une alternative dans la construction de la vue ?

    Merci de m'accorder un peu de temps.

    NM

  4. #4
    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
    Citation Envoyé par tegestobis Voir le message
    Merci pour votre réponse mais du coup je ne comprends pas pourquoi cela coince puisque le where devrait exclure les valeurs non numériques non ?
    Non, comme je vous l'ai écrit l'ordre des filtres dans le where n'est pas garanti.
    Ce qui signifie qu'Oracle peut tout à fait cherche à appliquer to_number(t_col_varchar) = 99999 avant EstNumerique(t_col_varchar) = 1, ce qui provoquera donc votre erreur !

    Pour les solutions, par exemple construisez votre vue ainsi (à essayer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t_col_varchar
         , case EstNumerique(t_col_varchar) when 1 then to_number(t_col_varchar) end as t_col_number
      FROM ma_table

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 32
    Par défaut
    Bonjour,

    Je viens de tester : ça marche nickel.

    Merci beaucoup pour votre aide.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    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 461
    Par défaut
    Vous pouvez interdire à Oracle de transformer votre requête en sous-main, ce qui permettra de traiter d'abord la vue avant d'y appliquer la condition 99999.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT /*+ NO_QUERY_TRANSFORMATION */
    * FROM ma_vue WHERE v_col_num=99999;
    Cela dit, ça reste un infâme bricolage.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/10/2008, 15h49
  2. Import de plusieurs vues Oracle
    Par iks22 dans le forum SQL
    Réponses: 4
    Dernier message: 26/02/2008, 14h31
  3. Mapper une vue oracle
    Par aloha dans le forum JPA
    Réponses: 2
    Dernier message: 13/02/2008, 17h13
  4. import d'une vue oracle
    Par habasque dans le forum Oracle
    Réponses: 5
    Dernier message: 26/10/2006, 16h23
  5. Les index et les vues oracle
    Par kariba dans le forum Oracle
    Réponses: 13
    Dernier message: 18/07/2006, 09h42

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