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');
CUSTOMER
? Solo ha proporcionado la mitad de la información necesaria.Respuestas:
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).
fuente
Suponga que el número de teléfono se define como
NUMBER
entonces los espacios en blanco no se pueden convertir en un número:Lo anterior te da una
fuente
Aquí hay una forma de resolverlo. Elimine los caracteres no numéricos y luego conviértalo en un número.
fuente
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.
fuente
Bueno, también puede ser:
donde para la concatenación en Oracle se usa el operador
||
no+
.En este caso obtienes:
ORA-01722: invalid number ...
fuente
Esto es porque:
Como se explica en:
Para resolver este error:
fuente
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:
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 :
... y voilà: Devuelve el resultado esperado.
editar: Y de hecho: la columna
acc_num
en mi tabla se define comoString
. Aunque no es numérico,invalid number
se 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:
fuente
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.
fuente
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_ACCOUNT
que tiene dos columnas: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:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
DELETE FROM FUND_ACCOUNT;
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);
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;
fuente
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
*.bad
archivo 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.
fuente
El error ORA-01722 es bastante sencillo. Según Tom Kyte :
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).fuente
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
fuente
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');
fuente