2012-07-17 95 views
10

Estoy trabajando en el sistema operativo Windows, sé que esta configuración se almacena en el registro. El problema es que la ruta del registro cambia de una versión a otra, pero navegar por ese conjunto de claves de registro definitivamente no es una buena idea.¿Cómo verifico NLS_LANG del cliente?

Puedo obtener el NLS_LANG del servidor con SELECT USERENV ('language') FROM DUAL.

Me gustaría comparar eso con la configuración del cliente y mostrar una advertencia cuando no coinciden, al igual que hace Pl/Sql Developer.

+0

¿Has mirado NLS_SESSION_PARAMETERS, NLS_DATABASE_PARAMETERS y NLS_INSTANCE_PARAMETERS? http://docs.oracle.com/cd/E11882_01/server.112/e25513.pdf – Glenn

+2

Bueno, me dan todo ... excepto el NLS_LANG del cliente –

+2

¿La vista de la sesión no da lo que estás buscando? select * from nls_session_parameters donde parameter = 'NLS_LANGUAGE'; alterar el conjunto de sesiones nls_language = german; select * from nls_session_parameters donde parameter = 'NLS_LANGUAGE'; – Glenn

Respuesta

6

Esto es lo que hago cuando soluciono problemas de codificación. (El valor leído por NLS_LANG sqlplus):

SQL>/* It's a hack. I don't know why it works. But it does!*/ 
SQL>@[%NLS_LANG%] 
SP2-0310: unable to open file "[NORWEGIAN_NORWAY.WE8MSWIN1252]" 

Usted se que extraer el valor de NLS_LANG en ORACLE_HOME actual del registro. Todas las herramientas del lado del cliente (sqlplus, sqlldr, exp, imp, oci, etc ...) leen este valor desde el registro y determinan si debe ocurrir alguna transcodificación de caracteres.

ORACLE_HOME y registro sección:

C:\>dir /s/b oracle.key 
C:\Oracle10\BIN\oracle.key 

C:\>type C:\Oracle10\BIN\oracle.key 
SOFTWARE\ORACLE\KEY_OraClient10204_Home 

En tiempos como estos me vuelvo a IPython para demostrar una idea:

Un par de operaciones de búsqueda y estás allí!

In [36]: OHOMES_INSTALLED = !where oci.dll 

In [37]: OHOMES_INSTALLED 
Out[37]: 
['C:\\Oracle10\\BIN\\oci.dll', 
'C:\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\bin\\oci.dll'] 

In [38]: ORACLE_HOME = os.path.dirname(OHOMES_INSTALLED[0]) 

In [39]: ORACLE_HOME 
Out[39]: 'C:\\Oracle10\\BIN' 

In [40]: f = open(os.path.join(ORACLE_HOME, "oracle.key")) 

In [41]: SECTION = f.read() 

In [42]: SECTION 
Out[42]: 'SOFTWARE\\ORACLE\\KEY_OraClient10204_Home\n' 

In [43]: from _winreg import * 

In [44]: aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 

In [46]: aKey = OpenKey(aReg,SECTION.strip()) 

In [47]: val = QueryValueEx(aKey, "NLS_LANG") 

In [48]: print val 
(u'NORWEGIAN_NORWAY.WE8MSWIN1252', 1) 
+0

Gracias, esto es una solución. Desafortunadamente, no puedo hacer eso. Todo lo que quería era realizar un control rápido.Una búsqueda completa en HD trae la respuesta, pero lleva demasiado tiempo (y además, no es * que * confiable, podría haber otros archivos con ese nombre). Entonces, si lo entendí correctamente, no hay una manera fácil. I * have * para navegar a través de esas locas claves de registro que cambian cada nuevo lanzamiento. ¿Está bien? En ese caso, creo que lo dejo caer. No vale la pena el esfuerzo. –

0

no estoy seguro si esto funciona todo el tiempo, pero para mí en SQL * Plus:

varchar2 n variable (200)

ejecutar sys.dbms_system.get_env ('NLS_LANG', : n)

impresión n

American_America.WE8ISO8859P1

Simplemente construya un envoltorio de funciones, otorgue la ejecución a los usuarios que lo necesiten, y listo.

+0

Después de algunas pruebas. GET_ENV no obtiene los parámetros del cliente, sino del proceso del servidor. Entonces no funciona como esperaba. Lo siento :-( – Jocke

+0

Después de excavar descubrí que la base de datos en realidad almacena el conjunto de caracteres del cliente para cada sesión conectada: SELECCIONE sid, client_charset FROM v $ session_connect_info; – Jocke

Cuestiones relacionadas