TransWikia.com

ORA-01722: Numero no valido SQL/Java

Stack Overflow en español Asked by nasito90 on August 27, 2021

tengo la siguiente consulta porque llevo un montón de tiempo con ella y es que no logro sacarla:
Uso SQL developer y Eclipse (java y jsp), y tengo lo siguiente:

Tabla1: Un valor decimal
mi_valor NUMBER(9,2)

En eclipse con sentencias parametrizadas:

String mi_valor; (aqui es String).

String query = "update Tabla1 set mi_valor = ?valor";

SentenciaPreparada sp = crearSentencia(query);

sp.ponParametro("valor", mi_valor.replace(".",","); --> Esto es porque en Java lo recogemos como por ejemplo 1.07 pero en SQL tiene que ser 1,07.

sp.ejecutaUpdate();

Una vez me funciona, pero luego durante un rato me deja de funcionar y me sale el dichoso ORA-01722: Numero no valido y saco por traza la sentencia.
Lo curioso es que esa misma sentencia que me da error, la ejecuto en SQL Developer y me funciona perfectamente, y si pruebo mas adelante me vuelve a funcionar una vez, pero solo una, y luego deja de funcionar…
Por traza lo que saca es update Tabla1 set mi_valor = '1,07' , que me funciona perfectamente en el Developer.

Tambien he probado poniendo:
update Tabla1 set mi_valor = to_number(replace(?valor,'.',','));

Pero pasa lo mismo, en SQL developer correctisimo ya que la traza de la sentencia es la misma, y desde la aplicación me funciona una vez si y luego ya no…

Es un ejemplo tonto para no saturar con una tabla grande y un montón de parámetros y trazas, aunque si es necesario lo pongo.

Y también decir que no soy un gran experto en la materia, recientemente he empezado a trabajar con ello.

Muchas gracias y un saludo.

One Answer

Ya que tienes un PreparedStatement prueba realizar los siguientes cambios:

La consulta para agregar un valor es INSERT, UPDATE es para actualizar el valor de uno o varios registros. Consulta SQL: INSERT INTO Tabla1(mi_valor) VALUES(?)

PreparedStatement: sp.setDouble(1, Double.valueOf(mi_valor)) ;

El número 1 en setDouble significa la primera variable representada por el primer símbolo ?, de esta forma el PreparedStatement se encargara de la correcta Traducción a la hora de insertar el valor numerico.

Como recomendación no manejes los numeros como String ya que es una mala practica.

Correct answer by Roberto E Moran on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP