Sélectionnez la chaîne que le nombre sur Oracle
J'ai trouvé ce comportement étrange et je suis en rupture de mon cerveau avec ce... quelqu'un a des idées?
Oracle 10g:
J'ai deux tables différentes, les deux ont cette colonne nommée "TESTCOL" comme Varchar2(10), pas les valeurs null.
Si j'exécute cette requête sur table1, j'obtiens le bon résultat:
select * from table1 where TESTCOL = 1234;
Note que je suis précisément de ne pas placer '1234'... c'est pas une faute de frappe, c'est une dynamique de la requête générée et je vais essayer de ne pas la modifier (du moins pas dans un avenir proche).
Mais, si j'exécute la même requête, sur table2, j'obtiens ce message d'erreur:
ORA-01722: Invalid number
Les deux requêtes sont exécutées sur la même session, la même base de données.
J'ai été rejoindre ces deux tables en fonction de cette colonne et la jointure fonctionne bien, le seul problème s'affiche à chaque fois que j'essaie d'utiliser cette condition.
Toutes les idées sur ce qui pourrait être différent d'une table à l'autre?
Merci d'avance.
OriginalL'auteur frenetix | 2012-03-27
Vous devez vous connecter pour publier un commentaire.
Si
TESTCOL
contient des nombres, puis Oracle pourrait rencontrer des problèmes lors de la conversion deTESTCOL
entrées de numéros. Parce que, ce qu'il fait à l'interne, est-ce:Si vous êtes si sûr que
1234
ne peut pas être exprimé comme uneVARCHAR
littérale, puis essayez plutôt ceci, afin de comparer varchar valeurs, plutôt que de les numériques:OriginalL'auteur Lukas Eder
Bien évident TABLE2.TESTCOL contient des valeurs qui ne sont pas des nombres. La comparaison d'une chaîne à un littéral numérique génère une conversion implicite. De sorte que toute valeur dans TESTCOL qui ne peut pas être converti en un numéro de lancer ORA-1722.
Il ne frappe pas vous où vous comparez les deux tables en raison de la comparaison de chaînes de caractères.
Si vous avez quelques options, pas de qui vous plaira. La réponse la plus évidente est de nettoyer les données afin de TABLE2 hdoesn pas contenir de non-numériques. Idéalement, vous devez combiner cela avec la modification de la colonne de type de données numérique. Sinon, vous pouvez modifier le générateur de sorte qu'il génère un code que vous pouvez exécuter à l'encontre d'un shonky modèle de données. Dans ce cas, que signifie emballage des littéraux dans les guillemets si la colonne mappés a un type de données caractère.
OriginalL'auteur APC
Vous sont frapper les dangers de l'implicite typecasting ici.
Avec l'expression
testcol = 1234
vous dites que vous voulez traitertestcol
comme une colonne numérique, de sorte Oracle tente de convertir toutes les valeurs dans cette colonne pour un certain nombre.L'ORA-01722 se produit parce que apparemment au moins une valeur dans cette colonne est pas un certain nombre.
Même si vous prétendez que c'est "pas une faute de frappe" en effet, il en est un. C'est une erreur de syntaxe.
Vous devrez déclarer votre paramètre comme un littéral de chaîne d'utiliser des guillemets simples:
where testcol = '1234'
La création d'un bon état est la seule solution à votre problème.
OriginalL'auteur a_horse_with_no_name
La suivante devrait fonctionner. Il suffit de remplacer le "point".
OriginalL'auteur Johan Hoogenboezem