web-dev-qa-db-fra.com

Comment vérifier le NLS_LANG du client?

Je travaille sur le système d'exploitation Windows, je sais que ce paramètre est stocké dans le registre. Le problème est que le chemin du registre change de version en version, la navigation dans ce groupe de clés de registre n’est certainement pas une bonne idée.

Je peux obtenir le NLS_LANG du serveur avec SELECT USERENV ('language') FROM DUAL

J'aimerais comparer cela avec les paramètres du client et afficher un avertissement quand ils ne correspondent pas, comme le fait Pl/Sql Developer.

11
Rafael Piccolo

C'est ce que je fais lorsque je résous des problèmes d'encodage. (La valeur NLS_LANG lue par 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]" 

Vous devrez devez extraire la valeur NLS_LANG du registre Oracle_HOME actuel du registre . Tous les outils côté client (sqlplus, sqlldr, exp, imp, oci, etc.) lisent cette valeur du registre. .et déterminer si un transcodage de caractère devrait avoir lieu. 

Oracle_HOME et la section de registre:

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

C:\>type C:\Oracle10\BIN\Oracle.key
SOFTWARE\Oracle\KEY_OraClient10204_Home

Dans des moments comme ceux-ci, je me tourne vers IPython pour illustrer une idée:

Quelques recherches et vous y êtes!

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)
7
Bjarte Brandt

Je ne sais pas si cela fonctionne à chaque fois, mais pour moi en sql * plus:

variable n varchar2 (200)

exécuter sys.dbms_system.get_env ('NLS_LANG',: n)

imprimer n

AMERICAN_AMERICA.WE8ISO8859P1

Il vous suffit de créer un wrapper de fonctions, d’accorder l’exécution aux utilisateurs qui en ont besoin, et le tour est joué.

1
Jocke