Errore SQL "ORA-01722: numero non valido"


101

Molto facile per qualcuno, il seguente inserto mi sta dando il file

ORA-01722: numero non valido

perché?

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
Allora ... qual è la definizione della tabella CUSTOMER? Hai fornito solo metà delle informazioni necessarie.
Greg Hewgill,

3
I numeri di telefono sono l'unica cosa che potrebbe ragionevolmente essere definita come un numero che i tuoi dati non rappresentano come un numero (gli spazi non sono numerici). Quindi: controlla la definizione della tua tabella e confrontala con le tue dichiarazioni di input.
APC

10
Perché le persone dovrebbero votare questa domanda. Per le persone che non conoscono i database, questo è uno strano errore. Posso vedere come racchiudere i valori tra virgolette potrebbe far sembrare che sia una stringa. Dipende solo da come è configurato il database. Potrebbe essere tutto stringhe o numeri dipende solo dai campi. Forse è stato un errore quando è stato creato il database.
sisharp

Un esempio in cui si verifica la situazione precedente: inserire nella tabella_1 (rollNumber) valori ('123'); dove rollNumber è una colonna di tipo "numero".
Ishani Gupta

3
"Tornato in dodici, ho tirato fuori un libro dallo scaffale e ho risposto a una domanda su Oracle. A 'Stack sono ancora esperto, con la conoscenza che ho conservato, ma non ho ancora un'accettazione. "
Aaron

Risposte:


121

Un errore ORA-01722 si verifica quando si tenta di convertire una stringa di caratteri in un numero e la stringa non può essere convertita in un numero.

Senza vedere la definizione della tabella, sembra che tu stia cercando di convertire la sequenza numerica alla fine dell'elenco dei valori in un numero e gli spazi che la delimitano generano questo errore. Ma in base alle informazioni che ci hai fornito, potrebbe accadere in qualsiasi campo (diverso dal primo).


2
Notare inoltre che completare manualmente un campo con "(null)" restituirà quell'errore. Se il valore predefinito è nullo e non lo completi, verrà completato automaticamente con (null) ma non è lo stesso quando lo digiti.
bogdan.rusu

Eh, "la stringa non può essere convertita in un numero" - Non è il punto. La stringa PU essere convertita in numero. Il punto qui è la conversione opposta di un numero in una colonna String, ma Oracle non lo fa automaticamente: devi renderlo una String tu stesso, contrassegnando il valore esplicitamente nella tua espressione SQL, per racchiuderlo con "OR" " .
Franta

25

Supponiamo che il numero di telefono sia definito in quanto NUMBERgli spazi non possono essere convertiti in un numero:

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

Quanto sopra ti dà un

ORA-01722: numero non valido


16

Ecco un modo per risolverlo. Rimuovi i caratteri non numerici, quindi lanciali come un numero.

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

6
In questo modo si rimuove lo zero iniziale.
Joe C

2
questo va all'OP originale - la colonna della tua tabella non può essere di tipo "numero" se vuoi memorizzare valori come '0419 853 694' perché numero non può avere zeri iniziali. nel mio caso però questo è proprio quello di cui avevo bisogno, ty gmlacrosse!
hipokito

10

Poiché questo errore si verifica quando si tenta di inserire un valore non numerico in una colonna numerica in db, sembra che l'ultimo campo potrebbe essere numerico e si sta tentando di inviarlo come stringa nel database. controlla il tuo ultimo valore.


8

Può anche essere:

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

dove per la concatenazione in Oracle viene utilizzato l'operatore ||no +.

In questo caso ottieni: ORA-01722: invalid number ...


1
Bella questa. Un altro destino velenoso potrebbe essere questo. Hai commentato un campo in un SELECT Fieldlist come - t.fieldname. Successivamente si intende rimuovere quel commento di inizio riga, ma un carattere commentato viene lasciato per sbaglio. Quindi c'è: - t.fieldname. Questo è successo a me, mentre stavo lavorando a una query molto grande, in cui devo commentare / rimuovere il commento da centinaia di colonne, mentre riorganizzavo la bestia.
olippuner

8

Questo è perché:

Hai eseguito un'istruzione SQL che ha tentato di convertire una stringa in un numero, ma non ha avuto successo.

Come spiegato in:

Per risolvere questo errore:

Solo i campi numerici oi campi di caratteri che contengono valori numerici possono essere utilizzati nelle operazioni aritmetiche. Assicurati che tutte le espressioni valutino in numeri.


4

Oracle esegue la conversione automatica String2number , per i valori delle colonne String ! Tuttavia, per i confronti testuali in SQL, l'input deve essere delimitato esplicitamente come una stringa: la conversione opposta number2String non viene eseguita automaticamente, non a livello di query SQL.

Ho avuto questa domanda:

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

Quello ha presentato un problema: Error: ORA-01722: invalid number

Ho appena circondato i valori "numerici" , per renderli 'Stringhe' , rendendoli delimitati esplicitamente :

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

... e voilà: restituisce il risultato atteso.

edit: E infatti: la colonna acc_numnella mia tabella è definita come String. Sebbene non numerico, è invalid numberstato segnalato. E la delimitazione esplicita dei numeri di stringa ha risolto il problema.

D'altra parte, Oracle può trattare le stringhe come numeri. Quindi le operazioni / funzioni numeriche possono essere applicate alle stringhe e queste query funzionano:

selezionare max (string_column) da TABELLA;

selezionare string_column da TABELLA dove string_column tra '2' e 'z';

seleziona colonna_stringa da TABELLA dove colonna_stringa > '1';

selezionare string_column da TABELLA dove string_column <= 'b';


ho riscontrato una situazione simile. ora-01722 numero-non valido è stato attivato in un'istruzione select, non in un'istruzione insert. Ho controllato la definizione della tabella e ho scoperto che la colonna era un varchar invece di un numero, quindi ho aggiunto virgolette singole attorno al numero
Newton fan 01

2

Nel mio caso l'errore di conversione era nell'indice basato sulla funzionalità , che avevo creato per la tabella.

I dati da inserire erano OK. Mi ci è voluto un po 'per capire che l'errore effettivo proveniva dall'indice difettoso.

Sarebbe bello se Oracle avesse potuto fornire un messaggio di errore più preciso in questo caso.


1

Se fai insert into...select * from...un'istruzione, è facile ottenere anche l'errore "Numero non valido".

Supponiamo che tu abbia una tabella chiamata FUND_ACCOUNTche ha due colonne:

AID_YEAR  char(4)
OFFICE_ID char(5)

Supponiamo che tu voglia modificare OFFICE_ID in modo numerico, ma che nella tabella siano presenti righe e, peggio ancora, alcune di queste righe abbiano un valore OFFICE_ID di "" (vuoto). In Oracle, non è possibile modificare il tipo di dati di una colonna se la tabella contiene dati e richiede un piccolo trucco per convertire un "" in uno 0. Quindi, ecco come farlo:

  1. Crea una tabella duplicata: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Elimina tutte le righe dalla tabella originale: DELETE FROM FUND_ACCOUNT;
  3. Quando non sono presenti dati nella tabella originale, modifica il tipo di dati della relativa colonna OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Ma poi ecco la parte difficile. Poiché alcune righe contengono valori OFFICE_ID vuoti, se esegui una semplice operazione INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, riceverai l'errore "ORA-01722 Numero non valido". Per convertire gli "OFFICE_ID" (vuoti) in 0, la tua istruzione di inserimento dovrà essere simile a questa:

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


Questo è un esempio molto complicato di un caso in cui potrebbe verificarsi l'errore + una spiegazione su come risolvere quel caso specifico, che potrebbe non essere affatto applicabile.
Jan Doggen,

0

Questo è successo anche a me, ma il problema in realtà era diverso: la codifica dei file .

Il file era corretto, ma la codifica del file era sbagliata. È stato generato dall'utilità di esportazione di SQL Server e l'ho salvato come Unicode.

Il file stesso sembrava buono nell'editor di testo, ma quando ho aperto il *.badfile che il caricatore SQL * ha generato con le righe rifiutate, ho visto che aveva caratteri errati tra ogni carattere originale. Poi ho pensato alla codifica.

Ho aperto il file originale con Notepad ++ e l'ho convertito in ANSI e tutto è stato caricato correttamente.


-1

L'errore ORA-01722 è piuttosto semplice. Secondo Tom Kyte :

Abbiamo tentato di convertire esplicitamente o implicitamente una stringa di caratteri in un numero e non riesce.

Tuttavia, dove si trova il problema spesso non è evidente all'inizio. Questa pagina mi ha aiutato a risolvere, trovare e risolvere il mio problema. Suggerimento: cerca i punti in cui stai convertendo esplicitamente o implicitamente una stringa in un numero. (Avevo NVL(number_field, 'string')nel mio codice.)


-1

prova anche questo, quando hai un errore di numero non valido

In questo a.emplid è il numero e b.emplid è un varchar2 quindi se devi convertire uno dei lati

dove to_char (a.emplid) = b.emplid


-4

Puoi sempre utilizzare la funzione TO_NUMBER () per rimuovere questo errore. Questo può essere incluso come INSERT INTO dipendenti phone_number values ​​(TO_NUMBER ('0419 853 694');

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.