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');
CUSTOMER
? Você forneceu apenas metade das informações necessárias.Respostas:
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).
fonte
Suponha que o número de telefone seja definido,
NUMBER
pois os espaços em branco não podem ser convertidos em um número:O acima dá-lhe um
fonte
Aqui está uma maneira de resolver isso. Remova os caracteres não numéricos e lance-os como um número.
fonte
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.
fonte
Bem, também pode ser:
onde para concatenação no oracle é usado o operador
||
não+
.Neste caso, você obtém:
ORA-01722: invalid number ...
fonte
Isto é porque:
Conforme explicado em:
Para resolver esse erro:
fonte
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:
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 :
... e voilà: retorna o resultado esperado.
editar: E de fato: o col
acc_num
em minha tabela é definido comoString
. Embora não seja numérico, oinvalid number
foi 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:
fonte
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.
fonte
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_ACCOUNT
com duas colunas: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:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
DELETE FROM FUND_ACCOUNT;
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);
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;
fonte
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
*.bad
arquivo 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.
fonte
O erro ORA-01722 é bastante direto. De acordo com Tom Kyte :
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.)fonte
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
fonte
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');
fonte