Tomcat - Cómo fijar el NLS_TERRITORY desde Tomcat

   
Vista:

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:

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:

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  = &apos;SPAIN&apos;" />
Pero lo dicho, nada de nada.
- En Hibenate: aunque me parece poco elegante, también he intentado cambiar el NLS_TERRITORY cada vez que comienzo una transacció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();
Resultado: negativo también :(

Puede alguien de este foro ser tan amable de indicarme qué puedo hacer?

Muchas gracias por adelantado.

Saludos,

José Luis
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder