it-swarm.com.de

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

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');
87
Phillip Gibson

Ein ORA-01722-Fehler tritt auf, wenn versucht wird, eine Zeichenfolge in eine Zahl zu konvertieren, und die Zeichenfolge nicht in eine Zahl konvertiert werden kann.

Ohne Ihre Tabellendefinition zu sehen, scheint es so, als würden Sie versuchen, die numerische Sequenz am Ende Ihrer Werteliste in eine Zahl umzuwandeln, und die Leerzeichen, die sie begrenzen, lösen diesen Fehler aus. Aber basierend auf den Informationen, die Sie uns gegeben haben, kann dies auf jedem Gebiet (außer dem ersten) geschehen.

110
Aaron

Angenommen, die Telefonnummer ist als NUMBER definiert, dann können die Leerzeichen nicht in eine Zahl umgewandelt werden:

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

22
hol

Hier ist ein Weg, um es 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)
14
gmlacrosse

Da dieser Fehler auftritt, wenn Sie versuchen, einen nicht numerischen Wert in eine numerische Spalte in db einzufügen, scheint das letzte Feld möglicherweise numerisch zu sein, und Sie versuchen, es als Zeichenfolge in der Datenbank zu senden. Überprüfen Sie Ihren letzten Wert.

10
Freelancer

Gut kann es auch sein:

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

wobei für die Verkettung in Oracle der Operator || nicht + verwendet wird.

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

8
Lazar Lazarov

Das ist weil:

Sie haben eine SQL-Anweisung ausgeführt, die versucht hat, eine Zeichenfolge in eine Zahl umzuwandeln, 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.

7
Mahmoud Gamal

Ich hatte diese Frage:

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

Das war ein Problem: Error: ORA-01722: invalid number

Ich habe gerade die "numerischen" Werte umschlossen, um sie 'Strings' zu machen und um sie explizit abgegrenzt:

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

... und voilà: Es gibt das erwartete Ergebnis zurück.

edit: Und tatsächlich: Die Spalte acc_num in meiner Tabelle ist als String definiert. Obwohl nicht numerisch, wurde der invalid number gemeldet. Und das explizite Abgrenzen der String-Nummern löste das Problem.

Andererseits behandelt Oracle can Strings als Zahlen. Die numerischen Operationen/Funktionen können also auf die Zeichenfolgen angewendet werden, und diese Abfragen funktionieren:

wähle max (string_column) aus TABLE;

wählen Sie string_column aus der Tabelle aus, wobei string_column between '2' und 'z';

wählen Sie string_column aus der Tabelle aus, wobei string_column > '1';

wählen Sie string_column aus der Tabelle aus, wobei string_column <= 'b';

3
Franta

In meinem Fall war der Konvertierungsfehler in funktionsbasierter 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 aus dem Buggy-Index stammt.

Wäre schön, wenn Oracle in diesem Fall eine genauere Fehlermeldung hätte geben können.

2
iTake

Wenn Sie eine insert into...select * from...Anweisung machen, ist es einfach, auch den Fehler "Ungültige Nummer" zu erhalten.

Angenommen, Sie haben eine Tabelle namens FUND_ACCOUNT mit zwei Spalten:

AID_YEAR  char(4)
OFFICE_ID char(5)

Nehmen wir an, Sie möchten die OFFICE_ID numerisch ändern, aber die Tabelle enthält bereits Zeilen. Schlimmer noch, einige dieser Zeilen haben den OFFICE_ID-Wert '' (leer). In Oracle können Sie den Datentyp einer Spalte nicht ändern, wenn die Tabelle Daten enthält, und die Konvertierung von '' in 0 erfordert einen kleinen Aufwand.

  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 beim Ausführen eines einfachen INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2 der Fehler "ORA-01722 Invalid Number" angezeigt. Um die '' (leeren) OFFICE_IDs in Nullen umzuwandeln, muss Ihre insert-Anweisung folgendermaßen aussehen:

INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;

1
Frank Staheli