Cómo fijar el NLS_TERRITORY desde Tomcat
Publicado por José Luis Álvarez (1 intervención) el 07/03/2016 20:01:15
Hola a tod@s,
Llevo más de una semana luchando con lo que parece una incidencia fácil sin éxito: mi BD Oracle lanza un ORA-01722: invalid number con ciertas consultas. Os lo explico con detalle, a ver si alguien puede echarme un cable.
Allá voy.
Tengo una aplicación basada en Struts 1.x e Hibernate 3.x. La BD es Oracle 10.2, y todo se ejecuta sobre un Linux Fedora.
La aplicación tiene una pantalla donde se hace una búsqueda sobre una tabla poniendo como criterio de filtro un valor numérico decimal. Ejemplo:
(He simplificado la traducción a Oracle, podéis notar que uso la coma como separador decimal)
El problema que tengo es que al hacer la consulta, como decía, Oracle lanza este error:
Es obvio que el error proviene de que el NLS_TERRITORY definido no acepta como separador decimal la coma. Pero aquí viene lo curioso: la BD tiene NLS_TERRITORY ='SPAIN'. De hecho si lanzo la consulta que me ejecuta la aplicación desde Oracle SQL Developer, no hay error. Sólo si fuerzo que el NLS_TERRITORY sea, por ejemplo, 'UNITED KINGDOM', entonces reproduzco el ORA-01722: invalid number.
Nota: el parámetro que controla qué separador decimal y de miles se quiere utilizar es NLS_NUMERIC_CHARACTERS pero he notado que si hago ALTER SESSION del NLS_TERRITORY, automáticamente el NLS_NUMERIC_CHARACTERS se ajusta.
He ido investigando y probando diferentes posibles soluciones:
Puede alguien de este foro ser tan amable de indicarme qué puedo hacer?
Muchas gracias por adelantado.
Saludos,
José Luis
Llevo más de una semana luchando con lo que parece una incidencia fácil sin éxito: mi BD Oracle lanza un ORA-01722: invalid number con ciertas consultas. Os lo explico con detalle, a ver si alguien puede echarme un cable.
Allá voy.
Tengo una aplicación basada en Struts 1.x e Hibernate 3.x. La BD es Oracle 10.2, y todo se ejecuta sobre un Linux Fedora.
La aplicación tiene una pantalla donde se hace una búsqueda sobre una tabla poniendo como criterio de filtro un valor numérico decimal. Ejemplo:
1
2
select pedido from Pedido as pedido where pedido.importe >=195.5 (Hibernate)
[Select * from gmv_pedidos where importe > to_number('195,5'); (Traducción a Oracle)
(He simplificado la traducción a Oracle, podéis notar que uso la coma como separador decimal)
El problema que tengo es que al hacer la consulta, como decía, Oracle lanza este error:
1
ORA-01722: invalid number
Es obvio que el error proviene de que el NLS_TERRITORY definido no acepta como separador decimal la coma. Pero aquí viene lo curioso: la BD tiene NLS_TERRITORY ='SPAIN'. De hecho si lanzo la consulta que me ejecuta la aplicación desde Oracle SQL Developer, no hay error. Sólo si fuerzo que el NLS_TERRITORY sea, por ejemplo, 'UNITED KINGDOM', entonces reproduzco el ORA-01722: invalid number.
Nota: el parámetro que controla qué separador decimal y de miles se quiere utilizar es NLS_NUMERIC_CHARACTERS pero he notado que si hago ALTER SESSION del NLS_TERRITORY, automáticamente el NLS_NUMERIC_CHARACTERS se ajusta.
He ido investigando y probando diferentes posibles soluciones:
- A nivel de Oracle: como he dicho, NLS_TERRITORY='SPAIN' y NLS_NUMERIC_CHARACTERS =',.' ( es decir, la coma de separador decimal, el punto de separador de miles)
- A nivel de Linux: el i18n.properties pone LANG="es_ES.UTF-8"
- Cambiar el server.xml para que incluya un "ALTER SESSION NLS_TERRITORY='SPAIN'". Esto no creo que realmente sea válido pero lo he visto en algún foro:
Pero lo dicho, nada de nada.
1
2
3
4
5
6
7
8
<Context path="/AppWeb" reloadable="true" allowLinking="true">
<Resource auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="100" maxIdle="100" maxWait="10000" initialSize="25"
name="jdbc/xweb" password="..." type="javax.sql.DataSource"
url="jdbc:oracle:thin:@IP:1521:the_sid" username="..."
initSQL="ALTER SESSION SET NLS_TERRITORY = 'SPAIN'" />
- En Hibenate: aunque me parece poco elegante, también he intentado cambiar el NLS_TERRITORY cada vez que comienzo una transacción:
Resultado: negativo también :(
1
2
3
4
5
6
session = sessionFactory.openSession();
session.beginTransaction();
PreparedStatement ps = session.connection().prepareStatement("alter session set NLS_TERRITORY='SPAIN'");
ps.execute();
Puede alguien de este foro ser tan amable de indicarme qué puedo hacer?
Muchas gracias por adelantado.
Saludos,
José Luis
Valora esta pregunta


0