SQL-Fehler "ORA-01722: ungültige Nummer"


101

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');

28
Also ... wofür ist die Tabellendefinition CUSTOMER? Sie haben nur die Hälfte der benötigten Informationen angegeben.
Greg Hewgill

3
Die Telefonnummern sind das einzige, was vernünftigerweise als eine Zahl definiert werden kann, die Ihre Daten nicht als Zahl darstellen (Leerzeichen sind nicht numerisch). Also: Überprüfen Sie Ihre Tabellendefinition und vergleichen Sie sie mit Ihren Eingabeanweisungen.
APC

9
Warum sollten die Leute diese Frage ablehnen? Für Leute, die neu in Datenbanken sind, ist dies ein seltsamer Fehler. Ich kann sehen, wie das Einschließen der Werte in Anführungszeichen dazu führen kann, dass es wie eine Zeichenfolge aussieht. Es hängt nur davon ab, wie die Datenbank eingerichtet ist. Es können alles Zeichenfolgen oder Zahlen sein, die nur von den Feldern abhängen. Möglicherweise war es ein Fehler, als die Datenbank erstellt wurde.
Sisharp

Ein Beispiel, in dem die obige Situation eintritt: In Tabelle_1 (rollNumber) Werte einfügen ('123'); Dabei ist rollNumber eine Spalte vom Typ "number".
Ishani Gupta

2
"Zurück in zwölf zog ich ein Buch aus dem Regal und beantwortete eine Oracle-Frage. Bei 'Stack bin ich immer noch geschickt, mit dem Wissen, das ich behalten habe, aber ich habe immer noch keine Akzeptanz. "
Aaron

Antworten:


121

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.


2
Beachten Sie auch, dass das manuelle Ausfüllen eines Felds mit "(null)" zu diesem Fehler führt. Wenn der Standardwert null ist und Sie ihn nicht vervollständigen, wird er automatisch mit (null) vervollständigt, aber er ist nicht derselbe, wenn Sie ihn eingeben.
Bogdan.rusu

Eh, "die Zeichenfolge kann nicht in eine Zahl umgewandelt werden" - Es ist nicht der Punkt. Der String kann in eine Zahl umgewandelt werden. Der Punkt hier ist die entgegengesetzte Konvertierung einer Zahl in eine String-Spalte, aber Oracle macht das nicht automatisch: Sie müssen es selbst zu einem String machen und den Wert explizit in Ihrem SQL-Ausdruck markieren, um ihn mit '' OR "" zu umgeben. .
Franta

25

Angenommen, die Telefonnummer ist so definiert, dass NUMBERdie Leerzeichen nicht in eine Nummer umgewandelt werden können:

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');

Das obige gibt Ihnen eine

ORA-01722: Ungültige Nummer


16

Hier ist eine Möglichkeit, dies zu lösen. Entfernen Sie nicht numerische Zeichen und geben Sie sie als Zahl ein.

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)

6
Dies würde die führende 0 entfernen.
Joe C

2
Dies geht zum ursprünglichen OP - Ihre Tabellenspalte kann nicht vom Typ "Nummer" sein, wenn Sie Werte wie '0419 853 694' speichern möchten, da die Nummer keine führenden Nullen haben kann. in meinem Fall ist dies jedoch genau das, was ich brauchte, ty gmlacrosse!
Hipokito

10

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.


8

Nun kann es auch sein:

SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
FROM table t;

wo für die Verkettung in Orakel der Bediener ||nicht verwendet wird +.

In diesem Fall erhalten Sie: ORA-01722: invalid number ...


1
Das ist gut. Ein anderes giftiges Schicksal könnte dies sein. Sie haben ein Feld in einer SELECT-Feldliste wie - t.fieldname auskommentiert. Später beabsichtigen Sie, diesen Zeilenstartkommentar zu entfernen, aber ein kommentiertes Zeichen bleibt versehentlich zurück. Somit gibt es: - t.fieldname. Dies passierte mir, als ich an einer sehr großen Abfrage arbeitete, bei der ich Hunderte von Spalten kommentieren / auskommentieren musste, während ich das Biest neu organisierte.
Olippuner

8

Das ist weil:

Sie haben eine SQL-Anweisung ausgeführt, die versucht hat, eine Zeichenfolge in eine Zahl zu konvertieren, die jedoch nicht erfolgreich war.

Wie erklärt in:

So beheben Sie diesen Fehler:

In arithmetischen Operationen können nur numerische Felder oder Zeichenfelder verwendet werden, die numerische Werte enthalten. Stellen Sie sicher, dass alle Ausdrücke zu Zahlen ausgewertet werden.


4

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:

select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;

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 :

select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';

... und voilà: Es wird das erwartete Ergebnis zurückgegeben.

edit: Und in der Tat: Die Spalte acc_numin meiner Tabelle ist definiert als String. Obwohl nicht numerisch, invalid numberwurde 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:

Wählen Sie max (string_column) aus TABLE aus.

Wählen Sie string_column aus TABLE aus, wobei string_column dazwischen liegt '2' und 'z' liegt.

Wählen Sie string_column aus TABLE aus, wobei string_column > '1';

Wählen Sie string_column aus TABLE aus, wobei string_column <= 'b';


Ich bin auf eine ähnliche Situation gestoßen. ora-01722 ungültige Nummer wurde bei einer select-Anweisung ausgelöst, nicht bei einer insert-Anweisung. Ich überprüfte die Tabellendefinition und stellte fest, dass die Spalte ein varchar anstelle einer Zahl war, also fügte ich einfache Anführungszeichen um die Zahl hinzu
Newton fan 01

2

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.


1

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_ACCOUNTmit zwei Spalten:

AID_YEAR  char(4)
OFFICE_ID char(5)

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:

  1. Erstellen Sie eine doppelte Tabelle: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Löschen Sie alle Zeilen aus der Originaltabelle: DELETE FROM FUND_ACCOUNT;
  3. Wenn die Originaltabelle keine Daten enthält, ändern Sie den Datentyp der Spalte OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. 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_ACCOUNT2Aktion 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;


Dies ist ein sehr kompliziertes Beispiel für einen Fall, in dem der Fehler auftreten könnte , + eine Erklärung zur Lösung dieses speziellen Falls, die möglicherweise überhaupt nicht zutrifft.
Jan Doggen

0

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.


-1

Der ORA-01722-Fehler ist ziemlich einfach. Laut Tom Kyte :

Wir haben versucht, eine Zeichenfolge explizit oder implizit in eine Zahl umzuwandeln, was jedoch fehlschlägt.

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.)


-1

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


-4

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.