私はWindows OSで作業していますが、この設定はレジストリに保存されていることを知っています。問題は、レジストリパスがバージョンごとに変化することです。ただし、そのレジストリキーの束は間違いなく良い考えではありません。
SELECT USERENV ('language') FROM DUAL
でサーバーのNLS_LANG
を取得できます。
Pl/Sql Developerと同じように、クライアント設定と比較し、一致しない場合は警告を表示したいと思います。
Jockeの回答(Jockeに感謝)によると、次のクエリをテストしました。
SELECT DISTINCT client_charset FROM v$session_connect_info
WHERE sid = sys_context('USERENV','SID');
それは完璧に仕事をしますが、ユーザーが必要な権利を持っているかどうかはわかりません。
これは、エンコードの問題をトラブルシューティングするときに行うことです。 (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]"
willレジストリから現在の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)
これが毎回機能するかどうかはわかりませんが、私にとってはsql * plus:
variable n varchar2(200)
execute sys.dbms_system.get_env('NLS_LANG', :n )
print n
AMERICAN_AMERICA.WE8ISO8859P1
関数ラッパーを作成し、それを必要とするユーザーに実行を許可するだけです。