Eine sehr einfache für jemanden, Die folgende Beilage gibt mir die
ORA-01722: Ungültige Nummer
Warum?
INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598');
INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5 Jones St Malvern','0413 591 341');
INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');
CUSTOMER
? Sie haben nur die Hälfte der benötigten Informationen angegeben.Antworten:
Ein ORA-01722-Fehler tritt auf, wenn versucht wird, eine Zeichenfolge in eine Zahl umzuwandeln, und die Zeichenfolge nicht in eine Zahl umgewandelt werden kann.
Ohne Ihre Tabellendefinition zu sehen, versuchen Sie anscheinend, die numerische Sequenz am Ende Ihrer Werteliste in eine Zahl umzuwandeln, und die durch sie begrenzten Leerzeichen lösen diesen Fehler aus. Aufgrund der Informationen, die Sie uns gegeben haben, kann dies jedoch in jedem Bereich (außer dem ersten) geschehen.
quelle
Angenommen, die Telefonnummer ist so definiert, dass
NUMBER
die Leerzeichen nicht in eine Nummer umgewandelt werden können:Das obige gibt Ihnen eine
quelle
Hier ist eine Möglichkeit, dies zu lösen. Entfernen Sie nicht numerische Zeichen und geben Sie sie als Zahl ein.
quelle
Da dieser Fehler auftritt, wenn Sie versuchen, einen nicht numerischen Wert in eine numerische Spalte in db einzufügen, scheint es, dass Ihr letztes Feld numerisch ist und Sie versuchen, es als Zeichenfolge in der Datenbank zu senden. Überprüfen Sie Ihren letzten Wert.
quelle
Nun kann es auch sein:
wo für die Verkettung in Orakel der Bediener
||
nicht verwendet wird+
.In diesem Fall erhalten Sie:
ORA-01722: invalid number ...
quelle
Das ist weil:
Wie erklärt in:
So beheben Sie diesen Fehler:
quelle
Oracle führt eine automatische String2number- Konvertierung für String-Spaltenwerte durch ! Für die Textvergleiche in SQL muss die Eingabe jedoch explizit als Zeichenfolge getrennt werden: Die entgegengesetzte Konvertierungsnummer2String wird nicht automatisch ausgeführt, nicht auf der SQL-Abfrageebene.
Ich hatte diese Frage:
Dieser stellte ein Problem dar:
Error: ORA-01722: invalid number
Ich habe gerade die "numerischen" Werte umgeben, um sie zu "Strings" zu machen , und sie nur explizit abgegrenzt :
... und voilà: Es wird das erwartete Ergebnis zurückgegeben.
edit: Und in der Tat: Die Spalte
acc_num
in meiner Tabelle ist definiert alsString
. Obwohl nicht numerisch,invalid number
wurde das gemeldet. Und die explizite Abgrenzung der String-Nummern löste das Problem.Auf der anderen Seite, Oracle können Strings als Zahlen behandeln. Die numerischen Operationen / Funktionen können also auf die Strings angewendet werden, und diese Abfragen funktionieren:
quelle
In meinem Fall lag der Konvertierungsfehler im funktionsbasierten Index , den ich für die Tabelle erstellt hatte.
Die eingefügten Daten waren in Ordnung. Ich habe eine Weile gebraucht, um herauszufinden, dass der eigentliche Fehler vom Buggy-Index herrührt.
Wäre schön, wenn Oracle in diesem Fall eine genauere Fehlermeldung hätte geben können.
quelle
Wenn Sie eine
insert into...select * from...
Anweisung abgeben, kann es auch leicht zu dem Fehler "Ungültige Nummer" kommen.Angenommen, Sie haben eine Tabelle
FUND_ACCOUNT
mit zwei Spalten:Angenommen, Sie möchten die OFFICE_ID so ändern, dass sie numerisch ist, aber die Zeile enthält bereits Zeilen. Schlimmer noch, einige dieser Zeilen haben den Wert OFFICE_ID von '' (leer). In Oracle können Sie den Datentyp einer Spalte nicht ändern, wenn die Tabelle Daten enthält, und es ist ein wenig schwierig, ein '' in eine 0 umzuwandeln. So geht's:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
DELETE FROM FUND_ACCOUNT;
Wenn die Originaltabelle keine Daten enthält, ändern Sie den Datentyp der Spalte OFFICE_ID:
ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);
Aber dann ist hier der schwierige Teil. Da einige Zeilen leere OFFICE_ID-Werte enthalten, wird bei einer einfachen
INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2
Aktion der Fehler "ORA-01722 Invalid Number" angezeigt. Um die '' (leeren) OFFICE_IDs in Nullen umzuwandeln, muss Ihre Einfügeanweisung folgendermaßen aussehen:INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;
quelle
Das ist mir auch passiert, aber das Problem war tatsächlich anders: Dateicodierung .
Die Datei war korrekt, aber die Dateicodierung war falsch. Es wurde vom Exportdienstprogramm von SQL Server generiert und ich habe es als Unicode gespeichert.
Die Datei selbst sah im Texteditor gut aus, aber als ich die öffnete
*.bad
Datei der SQL * -Lader mit den abgelehnten Zeilen generiert hatte, sah ich, dass zwischen jedem Originalzeichen schlechte Zeichen standen. Dann habe ich über die Kodierung nachgedacht.Ich habe die Originaldatei mit Notepad ++ geöffnet und in ANSI konvertiert und alles richtig geladen.
quelle
Der ORA-01722-Fehler ist ziemlich einfach. Laut Tom Kyte :
Wo das Problem liegt, ist jedoch oft zunächst nicht ersichtlich. Diese Seite hat mir geholfen, mein Problem zu beheben, zu finden und zu beheben. Tipp: Suchen Sie nach Stellen, an denen Sie eine Zeichenfolge explizit oder implizit in eine Zahl konvertieren. (Ich hatte
NVL(number_field, 'string')
in meinem Code.)quelle
Versuchen Sie dies auch, wenn Sie einen ungültigen Nummernfehler haben
In diesem Fall ist a.emplid eine Zahl und b.emplid ein varchar2. Wenn Sie also eine der Seiten konvertieren müssen
Dabei ist to_char (a.emplid) = b.emplid
quelle
Sie können jederzeit die Funktion TO_NUMBER () verwenden, um diesen Fehler zu beheben. Dies kann als INSERT INTO-Telefonnummer für Mitarbeiter (TO_NUMBER ('0419 853 694')) enthalten sein.
quelle