Wählen Sie die Zeichenfolge als Zahl in Oracle aus

7

Ich habe dieses merkwürdige Verhalten gefunden und ich breche mir damit den Kopf ... hat jemand irgendwelche Ideen?

Oracle 10g: Ich habe zwei verschiedene Tabellen, beide haben diese Spalte mit dem Namen " TESTCOL " als Varchar2 (10) , nicht reduzierbar.

Wenn ich diese Abfrage für tabelle1 durchführe, erhalte ich die richtigen Ergebnisse:

%Vor%

Hinweis dass ich nicht '1234' platziere ... es ist kein Tippfehler, das ist eine dynamisch generierte Abfrage und ich werde versuchen, sie nicht zu ändern (zumindest nicht in naher Zukunft) ).

Aber wenn ich dieselbe Abfrage auf table2 ausführe, erhalte ich folgende Fehlermeldung:

%Vor%

Beide Abfragen werden in derselben Sitzung und derselben Datenbank ausgeführt.

Ich habe diese zwei Tabellen durch diese Spalte verbunden und der Join funktioniert gut, das einzige Problem taucht auf, wenn ich versuche, diese Bedingung zu verwenden.

Irgendwelche Ideen, was sich von einer Tabelle zur anderen unterscheiden könnte?

Vielen Dank im Voraus.

    
frenetix 27.03.2012, 13:50
quelle

4 Antworten

22

Wenn TESTCOL Nicht-Nummern enthält, könnte Oracle Probleme beim Konvertieren von TESTCOL -Einträgen in Zahlen haben. Weil, was es intern tut, ist dies:

%Vor%

Wenn Sie sicher sind, dass 1234 nicht als VARCHAR literal ausgedrückt werden kann, versuchen Sie dies stattdessen, um Varchar-Werte anstelle von numerischen zu vergleichen:

%Vor%     
Lukas Eder 27.03.2012, 13:53
quelle
4

Nun offensichtlich TABLE2.TESTCOL enthält Werte, die keine Zahlen sind. Der Vergleich einer Zeichenfolge mit einem numerischen Literal generiert eine implizite Konvertierung. Jeder Wert in TESTCOL, der nicht in eine Zahl umgewandelt werden kann, wirft ORA-1722.

Es trifft Sie nicht, wo Sie die zwei Tabellen vergleichen, weil Sie Zeichenfolgen vergleichen.

Sie haben also ein paar Optionen, von denen Sie keine mögen. Die naheliegendste Antwort ist das Reinigen der Daten, so dass TABLE2 keine Nicht-Numerik enthält. Idealerweise sollten Sie dies kombinieren, indem Sie die Spalte in einen numerischen Datentyp ändern. Andernfalls können Sie den Generator so ändern, dass er Code erzeugt, den Sie gegen ein Shonky-Datenmodell ausführen können. In diesem Fall bedeutet das, dass Literale in Anführungszeichen eingeschlossen werden, wenn die zugeordnete Spalte einen Zeichendatentyp hat.

    
APC 27.03.2012 13:54
quelle
3

Sie treffen hier die Gefahren der impliziten Typisierung.

Mit dem Ausdruck testcol = 1234 geben Sie an, dass Sie testcol als numerische Spalte behandeln möchten. Daher versucht Oracle, alle Werte in dieser Spalte in eine Zahl zu konvertieren.

Der ORA-01722 tritt auf, weil anscheinend mindestens ein Wert in dieser Spalte nicht eine Zahl ist.

Obwohl Sie behaupten, dass dies " kein Tippfehler " ist, ist es tatsächlich eins. Es ist ein syntaktischer Fehler.

Sie müssen Ihren Parameter als String-Literal mit einfachen Anführungszeichen deklarieren: where testcol = '1234'

Das Erstellen einer korrekten Bedingung ist die einzige Lösung für Ihr Problem.

    
a_horse_with_no_name 27.03.2012 13:53
quelle
-1

Folgendes sollte funktionieren. Ersetzen Sie einfach das "Ihre wo".

%Vor%     
Johan Hoogenboezem 05.03.2013 09:37
quelle

Tags und Links