2012-07-17 12 views
10

मैं विंडोज ओएस पर काम कर रहा हूं, मुझे पता है कि यह सेटिंग रजिस्ट्री में संग्रहीत है। समस्या यह है कि रजिस्ट्री पथ संस्करण से संस्करण में बदलता है, ब्राउज़िंग हालांकि रजिस्ट्री कुंजियों का समूह निश्चित रूप से एक अच्छा विचार नहीं है।मैं क्लाइंट के NLS_LANG को कैसे देखूं?

मैं SELECT USERENV ('language') FROM DUAL के साथ सर्वर के NLS_LANG प्राप्त कर सकता हूं।

मैं क्लाइंट सेटिंग के साथ इसकी तुलना करना चाहता हूं और जब वे मेल नहीं खाते हैं तो चेतावनी दिखाएं, जैसे Pl/Sql डेवलपर करता है।

+0

क्या आपने एनएलएस_SESSION_PARAMETERS, NLS_DATABASE_PARAMETERS, और NLS_INSTANCE_PARAMETERS को देखा है? http://docs.oracle.com/cd/E11882_01/server.112/e25513.pdf – Glenn

+2

ठीक है, वे मुझे सब कुछ देते हैं ... क्लाइंट के NLS_LANG को छोड़कर –

+2

क्या सत्र दृश्य आपको जो भी ढूंढ रहा है उसे नहीं देता है? nls_session_parameters से चुनें * पैरामीटर = 'NLS_LANGUAGE'; सत्र सेट nls_language = जर्मन बदलें; nls_session_parameters से चुनें * पैरामीटर = 'NLS_LANGUAGE'; – Glenn

उत्तर

6

मैं एन्कोडिंग-समस्याओं का निवारण करते समय ऐसा करता हूं। (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]" 

आप रजिस्ट्री से वर्तमान 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) 
+0

धन्यवाद, यह एक कामकाज है। दुर्भाग्य से, मैं ऐसा नहीं कर सकता। मैं चाहता था कि एक त्वरित जांच करना था।एचडी में एक पूर्ण खोज उत्तर लाती है, लेकिन इसमें बहुत लंबा समय लगता है (और यह भी * विश्वसनीय * नहीं है, उस नाम के साथ अन्य फाइलें भी हो सकती हैं)। इसलिए, अगर मैं इसे सही ढंग से समझ गया, तो कोई आसान तरीका नहीं है। मैं ब्राउज़ करने के लिए * है कि पागल रजिस्ट्री कुंजी जो हर नई रिलीज जगह बदल जाते हैं। क्या वह सही है? उस स्थिति में, मुझे लगता है कि मैं इसे छोड़ दूंगा। यह प्रयास के लायक नहीं है। कुछ परीक्षण के बाद –

0

मुझे यकीन है कि अगर यह एसक्यूएल * में हर बार काम करता है मेरे लिए लेकिन प्लस नहीं कर रहा हूँ:

चर n varchar2 (200)

sys.dbms_system.get_env अमल ('NLS_LANG', : n)

प्रिंट n

AMERICAN_AMERICA.WE8ISO8859P1

बस एक फ़ंक्शन-रैपर बनाएं, उन उपयोगकर्ताओं को निष्पादित करें जिन्हें इसकी आवश्यकता है, और वहां आप जाते हैं।

+0

। GET_ENV क्लाइंट से पैरामीटर नहीं प्राप्त करता है लेकिन सर्वर प्रक्रिया से। तो यह काम नहीं करता है जैसा कि मैंने आशा की थी। क्षमा करें :-( – Jocke

+0

कुछ खुदाई के बाद मैंने पाया कि डेटाबेस वास्तव में प्रत्येक कनेक्टेड सत्र के लिए क्लाइंट कैरेक्टर सेट स्टोर करता है: SELECT sid, client_charset v $ session_connect_info से; – Jocke

संबंधित मुद्दे