Problème de conversion automatique number->varchar2 [Oracle] - SQL/NoSQL - Programmation
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; |
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; |
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; |
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.
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?
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
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.