Erro de SQL “ORA-01722: número inválido”


101

Muito fácil para alguém, o seguinte encarte está me dando o

ORA-01722: número inválido

porque?

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
Então ... para que serve a definição da mesa CUSTOMER? Você forneceu apenas metade das informações necessárias.
Greg Hewgill

3
Os números de telefone são a única coisa que pode ser razoavelmente definida como um numérico que seus dados não representam como um numérico (os espaços não são numéricos). Portanto: verifique a definição da tabela e compare com as instruções de entrada.
APC

10
Por que as pessoas votariam contra esta questão. Para pessoas que são novas em bancos de dados, esse é um erro estranho. Posso ver como colocar os valores entre aspas pode fazer com que pareça uma string. Depende apenas de como o banco de dados está configurado. Podem ser todos strings ou números, apenas depende dos campos. Talvez tenha sido um erro quando o banco de dados foi criado.
sisharp de

Um exemplo de onde vem a situação acima: insert into table_1 (rollNumber) values ​​('123'); onde rollNumber é uma coluna do tipo "número".
Ishani Gupta

3
"Lá em 12, tirei um livro da prateleira e respondi a uma pergunta sobre o Oráculo. Em 'Stack ainda sou adepto, com conhecimento que guardei, mas ainda não tenho um aceite. "
Aaron

Respostas:


121

Um erro ORA-01722 ocorre quando é feita uma tentativa de converter uma sequência de caracteres em um número e a sequência não pode ser convertida em um número.

Sem ver a definição da tabela, parece que você está tentando converter a sequência numérica no final da sua lista de valores em um número, e os espaços que a delimitam estão gerando esse erro. Mas, com base nas informações que você nos forneceu, pode estar acontecendo em qualquer campo (diferente do primeiro).


2
Observe também que preencher manualmente um campo com "(null)" resultará nesse erro. Se o padrão for nulo e você não completar, ele se completará automaticamente com (nulo), mas não é o mesmo quando você o digita.
bogdan.rusu

Eh, "a string não pode ser convertida em um número" - Não é o ponto. A string PODE ser convertida em número. O ponto aqui é a conversão oposta de um número em uma coluna String, mas o Oracle não faz isso automaticamente: você mesmo deve torná-lo um String, marcando o valor explicitamente em sua expressão SQL, para circundá-lo por '' OU "" .
Franta

25

Suponha que o número de telefone seja definido, NUMBERpois os espaços em branco não podem ser convertidos em um número:

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

O acima dá-lhe um

ORA-01722: número inválido


16

Aqui está uma maneira de resolver isso. Remova os caracteres não numéricos e lance-os como um número.

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

6
Isso removeria o 0.
Joe C

2
isso vai para o OP original - a coluna da sua tabela não pode ser do tipo "número" se você quiser armazenar valores como '0419 853 694' porque o número não pode ter zeros à esquerda. no meu caso, porém, isso é exatamente o que eu precisava, ty gmlacrosse!
hipokito

10

Como esse erro ocorre quando você tenta inserir um valor não numérico em uma coluna numérica no banco de dados, parece que seu último campo pode ser numérico e você está tentando enviá-lo como uma string no banco de dados. verifique seu último valor.


8

Bem, também pode ser:

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

onde para concatenação no oracle é usado o operador ||não +.

Neste caso, você obtém: ORA-01722: invalid number ...


1
Essa é boa. Outro destino venenoso pode ser este. Você comentou um campo em um SELECT Fieldlist como - t.fieldname. Posteriormente, você pretende remover o comentário de início de linha, mas um caractere comentado é deixado por acidente. Portanto, existe: - t.fieldname. Isso aconteceu comigo, quando eu estava trabalhando em uma consulta muito grande, onde tenho que comentar / descomentar centenas de colunas, enquanto reorganizo a besta.
olippuner

8

Isto é porque:

Você executou uma instrução SQL que tentou converter uma string em um número, mas não teve êxito.

Conforme explicado em:

Para resolver esse erro:

Somente campos numéricos ou campos de caracteres que contêm valores numéricos podem ser usados ​​em operações aritméticas. Certifique-se de que todas as expressões sejam avaliadas em números.


4

O Oracle faz a conversão automática de String2number , para valores de coluna String ! No entanto, para as comparações textuais em SQL, a entrada deve ser delimitada explicitamente como uma String: A conversão oposta number2String não é executada automaticamente, não no nível de consulta SQL.

Tive esta dúvida:

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

Aquele apresentou um problema: Error: ORA-01722: invalid number

Acabei de circundar os valores "numéricos" , para torná-los 'Strings' , apenas tornando-os explicitamente delimitados :

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

... e voilà: retorna o resultado esperado.

editar: E de fato: o col acc_numem minha tabela é definido como String. Embora não seja numérico, o invalid numberfoi relatado. E a delimitação explícita dos números da string resolveu o problema.

Por outro lado, o Oracle pode tratar Strings como números. Portanto, as operações / funções numéricas podem ser aplicadas nas Strings, e essas consultas funcionam:

selecione max (string_column) em TABLE;

selecione string_column em TABLE onde string_column entre '2' e 'z';

selecione coluna_string em TABLE onde coluna_string > '1';

selecione coluna_string em TABLE onde coluna_string <= 'b';


eu encontrei uma situação semelhante. ora-01722 invalid-number foi disparado em uma instrução select, não em uma instrução insert. Eu verifiquei a definição da tabela e descobri que a coluna era um varchar em vez de um número, então adicionei aspas simples ao redor do número
Newton fan 01

2

No meu caso o erro de conversão foi no índice funcional , que criei para a tabela.

Os dados sendo inseridos estavam OK. Demorei um pouco para descobrir que o erro real veio do índice de bugs.

Seria bom, se o Oracle pudesse ter dado uma mensagem de erro mais precisa neste caso.


1

Se você fizer uma insert into...select * from...declaração, também será fácil obter o erro 'Número inválido'.

Digamos que você tenha uma tabela chamada FUND_ACCOUNTcom duas colunas:

AID_YEAR  char(4)
OFFICE_ID char(5)

E digamos que você deseja modificar o OFFICE_ID para ser numérico, mas que existem linhas existentes na tabela e, pior ainda, algumas dessas linhas têm um valor OFFICE_ID de '' (em branco). No Oracle, você não pode modificar o tipo de dados de uma coluna se a tabela tiver dados, e requer alguns truques para converter um '' em 0. Então, veja como fazer isso:

  1. Crie uma tabela duplicada: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Exclua todas as linhas da tabela original: DELETE FROM FUND_ACCOUNT;
  3. Uma vez que não há dados na tabela original, altere o tipo de dados de sua coluna OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Mas então aqui está a parte complicada. Como algumas linhas contêm valores OFFICE_ID em branco, se você fizer um simples INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, receberá o erro "ORA-01722 Número inválido". Para converter os OFFICE_IDs '' (em branco) em 0s, sua instrução de inserção terá que ser semelhante a:

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


Este é um exemplo muito complicado de um caso em que o erro pode ocorrer + uma explicação de como resolver aquele caso específico, que pode não se aplicar de todo.
Jan Doggen

0

Isso aconteceu comigo também, mas o problema era realmente diferente: codificação do arquivo .

O arquivo estava correto, mas a codificação do arquivo estava errada. Ele foi gerado pelo utilitário de exportação do SQL Server e salvei como Unicode.

O arquivo em si parecia bom no editor de texto, mas quando abri o *.badarquivo que o carregador SQL * gerou com as linhas rejeitadas, vi que havia caracteres inválidos entre cada caractere original. Então pensei sobre a codificação.

Abri o arquivo original com o Notepad ++ e converti para ANSI, e tudo foi carregado corretamente.


-1

O erro ORA-01722 é bastante direto. De acordo com Tom Kyte :

Tentamos converter explicitamente ou implicitamente uma cadeia de caracteres em um número e está falhando.

No entanto, onde o problema está muitas vezes não é aparente à primeira vista. Esta página me ajudou a solucionar, localizar e corrigir meu problema. Dica: procure lugares onde você está explicitamente ou implicitamente convertendo uma string em um número. (Eu tinha NVL(number_field, 'string')em meu código.)


-1

tente fazer isso também, quando você tiver um erro de número inválido

Neste a.emplid é um número e b.emplid é um varchar2, então se você converter um dos lados

onde to_char (a.emplid) = b.emplid


-4

Você sempre pode usar a função TO_NUMBER () para remover este erro. Isso pode ser incluído como valores de número_do_telefone de funcionários INSERT INTO (TO_NUMBER ('0419 853 694');

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.