Error de SQL "ORA-01722: número no válido"

101

Uno muy fácil para alguien, el siguiente inserto me da la

ORA-01722: número inválido

¿por qué?

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');
Phillip Gibson
fuente
28
Entonces ... ¿para qué sirve la definición de tabla CUSTOMER? Solo ha proporcionado la mitad de la información necesaria.
Greg Hewgill
3
Los números de teléfono son lo único que razonablemente podría definirse como un número que sus datos no representan como un número (los espacios no son numéricos). Entonces: verifique la definición de su tabla y compárela con sus declaraciones de entrada.
APC
10
¿Por qué la gente votaría en contra de esta pregunta? Para las personas que son nuevas en las bases de datos, este es un error extraño. Puedo ver cómo encerrar los valores entre comillas puede hacer que parezca una cadena. Solo depende de cómo esté configurada la base de datos. Pueden ser cadenas o números, solo depende de los campos. Quizás fue un error cuando se creó la base de datos.
sisharp
Un ejemplo donde viene la situación anterior: inserte en table_1 (rollNumber) valores ('123'); donde rollNumber es una columna de tipo "número".
Ishani Gupta
3
"De regreso a los doce, saqué un libro de la estantería y respondí una pregunta de Oracle. En 'Stack todavía soy un experto, con el conocimiento que he guardado, pero todavía no tengo una aceptación "
Aaron

Respuestas:

121

Se produce un error ORA-01722 cuando se intenta convertir una cadena de caracteres en un número y la cadena no se puede convertir en un número.

Sin ver la definición de su tabla, parece que está tratando de convertir la secuencia numérica al final de su lista de valores en un número, y los espacios que la delimitan están arrojando este error. Pero según la información que nos ha proporcionado, podría estar sucediendo en cualquier campo (que no sea el primero).

Aaron
fuente
2
También observe que completar manualmente un campo con "(nulo)" le dará ese error. Si el valor predeterminado es nulo y no lo completa, se completará automáticamente con (nulo) pero no es lo mismo cuando lo escribe.
bogdan.rusu
Eh, "la cadena no se puede convertir en un número" - No es el punto. La cadena PUEDE convertirse en número. El punto aquí es la conversión opuesta de un número a una columna de cadena, pero Oracle no lo hace automáticamente: debe convertirlo en una cadena usted mismo, marcando el valor explícitamente en su expresión SQL, para rodearlo por '' O "" .
Franta,
25

Suponga que el número de teléfono se define como NUMBERentonces los espacios en blanco no se pueden convertir en un número:

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

Lo anterior te da una

ORA-01722: número inválido

hol
fuente
16

Aquí hay una forma de resolverlo. Elimine los caracteres no numéricos y luego conviértalo en un número.

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
gmlacrosse
fuente
6
Hacer esto eliminaría el 0 inicial.
Joe C
2
esto va al OP original: la columna de su tabla no puede ser de tipo "número" si desea almacenar valores como '0419 853 694' porque el número no puede tener ceros a la izquierda. en mi caso, sin embargo, esto es justo lo que necesitaba, ¡ty gmlacrosse!
hipokito
10

Como este error se produce cuando intenta insertar un valor no numérico en una columna numérica en db, parece que su último campo puede ser numérico y está intentando enviarlo como una cadena en la base de datos. verifique su último valor.

Persona de libre dedicación
fuente
8

Bueno, también puede ser:

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

donde para la concatenación en Oracle se usa el operador ||no +.

En este caso obtienes: ORA-01722: invalid number ...

Lazar Lazarov
fuente
1
Esa es buena. Otro destino venenoso puede ser este. Comentó un campo en una SELECT Fieldlist como - t.fieldname. Más tarde, tiene la intención de eliminar ese comentario de inicio de línea, pero un carácter comentado se deja por accidente. Por tanto, existe: - t.fieldname. Esto me sucedió, cuando estaba trabajando en una consulta muy grande, donde tengo que comentar / descomentar cientos de columnas, mientras reorganizo la bestia.
olippuner
8

Esto es porque:

Ejecutó una instrucción SQL que intentó convertir una cadena en un número, pero no tuvo éxito.

Como se explica en:

Para resolver este error:

Solo los campos numéricos o los campos de caracteres que contienen valores numéricos pueden usarse en operaciones aritméticas. Asegúrate de que todas las expresiones se evalúen como números.

Mahmoud Gamal
fuente
4

Oracle realiza una conversión automática de String2number , para valores de columna de cadena . Sin embargo, para las comparaciones textuales en SQL, la entrada debe estar delimitada como una Cadena explícitamente: La conversión opuesta number2String no se realiza automáticamente, no en el nivel de consulta SQL.

Tuve esta consulta:

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

Ese presentaba un problema: Error: ORA-01722: invalid number

Acabo de rodear los valores "numéricos" , para convertirlos en 'Cadenas' , simplemente haciéndolos delimitados explícitamente :

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

... y voilà: Devuelve el resultado esperado.

editar: Y de hecho: la columna acc_numen mi tabla se define como String. Aunque no es numérico, invalid numberse informó. Y la delimitación explícita de los números de cadena resolvió el problema.

Por otro lado, Oracle puede tratar las cadenas como números. Entonces, las operaciones / funciones numéricas se pueden aplicar en las cadenas, y estas consultas funcionan:

seleccione max (string_column) de TABLE;

seleccione string_column de TABLE donde string_column entre '2' y 'z';

seleccione string_column de TABLE donde string_column > '1';

seleccione string_column de TABLE donde string_column <= 'b';

Franta
fuente
Encontré una situación similar. ora-01722 se activó un número inválido en una instrucción de selección, no en una instrucción de inserción. Verifiqué la definición de la tabla y encontré que la columna era un varchar en lugar de un número, así que agregué comillas simples alrededor del número
Newton fan 01
2

En mi caso, el error de conversión estaba en el índice funcional , que había creado para la tabla.

Los datos que se estaban insertando estaban bien. Me tomó un tiempo darme cuenta de que el error real provenía del índice de errores.

Sería bueno, si Oracle pudiera haber dado un mensaje de error más preciso en este caso.

tomo
fuente
1

Si realiza una insert into...select * from...declaración, también es fácil obtener el error "Número no válido".

Digamos que tiene una tabla llamada FUND_ACCOUNTque tiene dos columnas:

AID_YEAR  char(4)
OFFICE_ID char(5)

Y digamos que desea modificar OFFICE_ID para que sea numérico, pero que existen filas en la tabla y, lo que es peor, algunas de esas filas tienen un valor de OFFICE_ID de '' (en blanco). En Oracle, no puede modificar el tipo de datos de una columna si la tabla tiene datos, y se requiere un pequeño truco para convertir un '' en un 0. Así que aquí se explica cómo hacerlo:

  1. Crea una tabla duplicada: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Elimina todas las filas de la tabla original: DELETE FROM FUND_ACCOUNT;
  3. Una vez que no haya datos en la tabla original, modifique el tipo de datos de su columna OFFICE_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Pero aquí está la parte complicada. Debido a que algunas filas contienen valores OFFICE_ID en blanco, si realiza una operación simple INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, obtendrá el error "ORA-01722 Invalid Number". Para convertir los OFFICE_ID '' (en blanco) en ceros, su declaración de inserción tendrá que verse así:

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

Frank Staheli
fuente
Este es un ejemplo muy complicado de un caso en el que podría ocurrir el error + una explicación de cómo resolver ese caso específico, que puede no aplicarse en absoluto.
Jan Doggen
0

Esto también me pasó a mí, pero el problema en realidad era diferente: la codificación de archivos .

El archivo era correcto, pero la codificación del archivo era incorrecta. Fue generado por la utilidad de exportación de SQL Server y lo guardé como Unicode.

El archivo en sí se veía bien en el editor de texto, pero cuando abrí el *.badarchivo que generó el cargador SQL * con las líneas rechazadas, vi que tenía caracteres incorrectos entre cada carácter original. Luego pensé en la codificación.

Abrí el archivo original con Notepad ++ y lo convertí a ANSI, y todo se cargó correctamente.

ciencia
fuente
-1

El error ORA-01722 es bastante sencillo. Según Tom Kyte :

Hemos intentado convertir explícitamente o implícitamente una cadena de caracteres en un número y está fallando.

Sin embargo, a menudo no es evidente al principio dónde está el problema. Esta página me ayudó a solucionar problemas, encontrar y solucionar mi problema. Sugerencia: busque lugares donde esté convirtiendo explícita o implícitamente una cadena en un número. (Lo tenía NVL(number_field, 'string')en mi código).

Baodad
fuente
-1

intente esto también, cuando tenga un error de número no válido

En este a.emplid es un número y b.emplid es un varchar2, así que si tienes que convertir uno de los lados

donde to_char (a.emplid) = b.emplid

Arrendajo
fuente
-4

Siempre puede usar la función TO_NUMBER () para eliminar este error. Esto se puede incluir como INSERT INTO los valores de número de teléfono de los empleados (TO_NUMBER ('0419 853 694');

Harshit Gupta
fuente