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.