19

私はWindowsOSで作業していますが、この設定がレジストリに保存されていることを知っています。問題は、レジストリパスがバージョンごとに変化し、レジストリキーの束を参照することは、間違いなく良い考えではないということです。

NLS_LANGでサーバーのを取得できますSELECT USERENV ('language') FROM DUAL

これをクライアント設定と比較し、Pl / Sql Developerと同様に、一致しない場合は警告を表示したいと思います。

4

3 に答える 3

9

これは、エンコーディングの問題をトラブルシューティングするときに行うことです。(sqlplusによって読み取られたNLS_LANG値):

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]" 

レジストリから現在のORACLE_HOMEのNLS_LANG値を抽出する必要があります。すべてのクライアント側ツール(sqlplus、sqlldr、exp、imp、ociなど)は、レジストリからこの値を読み取り、文字のトランスコーディングを実行する必要があるかどうかを判断します。

ORACLE_HOMEおよびレジストリセクション:

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

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

このようなとき、私はIPythonを使用してアイデアを示します。

いくつかのルックアップとあなたはそこにいます!

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)
于 2012-07-17T18:50:22.773 に答える
5

Jockeの答え(Jockeに感謝)によると、私は次のクエリをテストしました:

SELECT DISTINCT client_charset FROM v$session_connect_info
WHERE sid = sys_context('USERENV','SID');

それは完璧に機能しますが、必要な権限を持つユーザーがいるかどうかはわかりません。

于 2019-04-04T08:51:51.530 に答える
3

これが毎回機能するかどうかはわかりませんが、sql*plusでは次のようになります。

variable n varchar2(200)

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

print n

AMERICAN_AMERICA.WE8ISO8859P1

関数ラッパーを作成し、それを必要とするユーザーに実行を許可するだけで、すぐに実行できます。

于 2018-01-19T13:47:38.853 に答える