[Oracle] Problème de conversion automatique number->varchar2

Problème de conversion automatique number->varchar2 [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 21-10-2010 à 16:07:48    

Salut,

 

J'ai un problème avec une requete, je sèche un peu.
Noms des colonnes et de la table changés parce que c'est pour le boulot donc bon.

 

SQL> desc table_exemple
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(38)
 FK_1_KEY                                           VARCHAR2(100)
 FK_2_ID                                   NOT NULL NUMBER(38)

 

SQL> select FK_1_KEY from table_exemple where FK_1_KEY = 1005 and FK_2_ID in (1025,1025);
no rows selected

 

SQL> select FK_1_KEY from table_exemple where FK_1_KEY = 1005;
ERROR:
ORA-01722: invalid number


Bon on est d'accord, il devrait y avoir des quotes autour de 1005, c'est rajouté depuis et le problème ne se pose plus. Maintenant j'aimerais bien savoir pourquoi la conversion number->varchar2 a lieu dans le premier cas et pas dans le second.

 

C'est sous Oracle, en SQLPlus mais bon ca fait la meme chose depuis l'application. A noter que ca se passe sur le schema de dev, avec le schema de qualif qui de son coté lève l'erreur ORA-01722: invalid number dès la première requete!

 

Il y a donc une différence entre les deux schémas (ce qui est mal et quelqu'un a mal fait son boulot) mais je suis loin d'etre assez calé pour savoir où.

 

Quelqu'un aurait une idée?

 

Merci!


Message édité par lasnoufle le 21-10-2010 à 18:11:35

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 21-10-2010 à 16:07:48   

Reply

Marsh Posté le 22-10-2010 à 12:29:54    

On peut même faire plus simple, ce qui prouve que le problème ne vient pas du IN.

SQL> select FK_1_KEY from table_exemple where FK_1_KEY = 1005 and FK_2_ID = 1025;
no rows selected


On peut aussi inverser l'ordre et avoir la même chose :

SQL> select FK_1_KEY from table_exemple where  FK_2_ID = 1025 and FK_1_KEY = 1005;
no rows selected


Par contre, si la condition sur FK_2_ID est vérifiée (supposons que 123 existe), alors on a une erreur ORA-01722: invalid number  

SQL> select FK_1_KEY from table_exemple where FK_1_KEY = 1005 and FK_2_ID = 123;
ORA-01722: invalid number


Citation :

Maintenant j'aimerais bien savoir pourquoi

La réponse est : parce que ! Je devine que c'est pour des raisons historiques. Si le comportement avait été changé dans sqlplus, cela aurait créé une incompatibilité par rapport à d'anciens programme. Oracle aurait choisi de ne pas changer cela.

Reply

Marsh Posté le 22-10-2010 à 17:36:11    

Mh OK je crois que je viens de comprendre. En fait il n'y a jamais de conversion number->varchar2 et si la requete arrive jusqu'au moment ou elle "devrait" la faire, ben c'est dans l'cul lulu. Ce qu'elle n'a pas besoin de faire si la seconde condition est exécutée en premier et filtre tout. C'est ca?


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 26-10-2010 à 22:23:20    

C'est une histoire de plan d'execution et d'optimisation.
Dans une condition comme celle-la, oracle à le choix entre comparer deux entier, et deux chaines de caractères. Il estime donc que comparer deux entiers est plus rapide (ce qui est vrai dans 99,99% des cas)
Celà a vrai à condition que les deux colonnes soit indexés de la même façon, sinon ca dépendra de tes index

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed