Hoy vamos a ver una de las cosas mas simples que hay en Oracle y de las que mas quebraderos de cabeza traen, la globalizacion.
Las variables que definen el idioma, numeros,fechas, ordenacion… de Oracle son las llamadas variables de globalización de Oracle o mas comumente parámetros NLS.
Para evitar problemas con los acentos, eñes, puntos/comas,fechas…. deberias de tener claro cual es el NLS_LANG que tienes/quieres . Pero vamos a dejar este NLS_LANG para un poco mas adelante
Las principales variables para un entorno de oracle son:
• NLS_LANGUAJE: Se usa para los mensajes (incluidos los de error)
• NLS_DATE_LANGUAJE: Para los nombres de día y mes
• NLS_SORT: (Binary) para la ordenación lingüística
Adicionalmente, tenemos una variable de entorno que nos define un amplio número de variables , este prámetro es NLS_TERRITORY , esta variable define las siguientes subvariables
• NLS_CURRENCY
• NLS_DUAL_CURRENCY
• NLS_ISO_CURRENCY
• NLS_DATE_FORMAT
• NLS_NUMERICA_CHARACTERS
• NLS_TIMESTAMP_FORMAT
• NLS_TIMESTAMP_TZ_FORMAT
Una vez visto esto, volvemos a NLS_LANG que se define como:
NLS_LANG=<language>_<territory>.<character set> (por ejemplo export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 o en español export NLS_LANG=SPANISH_SPAIN.WE8MSWIN1252 )
Así pues, si definimos correctamente nuestra variable NLS_LANG tendremos practicamente todas las variables de entorno definidas y conseguiremos que nuestras consultas tengan los caracteres que queremos.
Las variables de globalización de una base de datos se pueden fijar a 5 niveles:
- Database
- Instancia
- Cliente
- Sesión
- Sentencia
Cada nivel inferior anula a un superior, es decir, si yo fijo una variable de entorno en una sentencia esta variable prevalecerá sobre las variables de base de datos, instancia o sesion.
Llegados a este punto, sabemos que queremos, pero, no sabemos que tenemos. ¿Como podemos saber que parámetros NLS tenemos definidos en nuestro cliente/aplicacion?
La solucion es muy sencilla, solamente tenemos que conectarnos y preguntar.
Para ver todas las variables de nuestra conexion de cliente
SQL> set pagesize 200; column parameter format a25; column value format a40; select * from v$nls_parameters; PARAMETER VALUE ------------------------- ---------------------------------------- NLS_LANGUAGE SPANISH NLS_TERRITORY SPAIN NLS_CURRENCY € NLS_ISO_CURRENCY SPAIN NLS_NUMERIC_CHARACTERS ,. NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD/MM/RR NLS_DATE_LANGUAGE SPANISH NLS_CHARACTERSET WE8MSWIN1252 NLS_SORT SPANISH NLS_TIME_FORMAT HH24:MI:SSXFF NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR NLS_DUAL_CURRENCY € NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE 19 rows selected.
o la variable languaje exportada del entorno
SQL> SELECT USERENV ('language') FROM DUAL;
USERENV('LANGUAGE')
----------------------------------------------------
SPANISH_SPAIN.WE8MSWIN1252
Con esto seguramente encontremos la explicación de por que las fechas no nos salen como queremos, vemos caracteres extraños en las ñ o nos fallan las inseciones por culpa de los . y ,