Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/09/2011, 15h17   #1
Invité régulier
 
Inscription : mai 2004
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 22
Points : 9
Points : 9
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 :

Citation:
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 :

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

par contre dés que je fais un :

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

Je précise que la syntaxe

Citation:
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
tegestobis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h24   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tout simplement parce que cette requête-ci :
Code :
1
2
3
SELECT *
  FROM ma_vue
 WHERE v_col_num = 99999
Est transformée par Oracle en ceci :
Code :
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h30   #3
Invité régulier
 
Inscription : mai 2004
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 22
Points : 9
Points : 9
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
tegestobis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h45   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h53   #5
Invité régulier
 
Inscription : mai 2004
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 22
Points : 9
Points : 9
Bonjour,

Je viens de tester : ça marche nickel.

Merci beaucoup pour votre aide.
tegestobis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h53   #6
Rédacteur
 
Inscription : décembre 2002
Messages : 2 387
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 387
Points : 3 272
Points : 3 272
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 :
1
2
SELECT /*+ NO_QUERY_TRANSFORMATION */
* FROM ma_vue WHERE v_col_num=99999;
Cela dit, ça reste un infâme bricolage.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h21.


 
 
 
 
Partenaires

Hébergement Web