Hoe controleer ik de NLS_LANG van de cliënt?

Ben ik bezig met het Windows OS, ik weet dat deze instelling wordt opgeslagen in het register. Het probleem is dat het register pad wijzigingen van versie tot versie, browsen hoewel die groep van register sleutels is zeker niet een goed idee.

Ik kan krijgen van de NLS_LANG van de server met SELECT USERENV ('language') FROM DUAL.

Wil ik vergelijk dat met de client installeren en een waarschuwing laten zien als ze niet overeenkomen, net als Pl/Sql Developer is.



3 Replies
  1. 1

    Volgens Jocke antwoord (met dank Jocke), heb ik getest met de volgende query:

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

    Het perfect doet het werk, maar ik ben niet zeker als een gebruiker over de vereiste rechten.

  2. 7

    Dit is wat ik doe wanneer ik problemen met het coderen-problemen. (De NLS_LANG waarde gelezen door 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]" 

    U zal hebben voor het uitpakken van de NLS_LANG waarde in de huidige ORACLE_HOME van het register.
    Alle client-side tools (sqlplus, sqlldr, exp, imp, oci, enz…) lees deze waarde uit register
    en bepalen als een teken transcoderen moet optreden.

    ORACLE_HOME en het gedeelte van het register:

    C:\>dir /s/b oracle.key
    C:\Oracle10\BIN\oracle.key
    
    C:\>type C:\Oracle10\BIN\oracle.key
    SOFTWARE\ORACLE\KEY_OraClient10204_Home

    In tijden als deze ben ik aan de beurt om IPython te laten zien dat het idee:

    Een paar opzoeken en je bent er!

    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)
    • Bedankt, dit is een tijdelijke oplossing. Helaas kan ik dat niet doen. Alles wat ik wilde was om het uitvoeren van een quick scan. Een volledige zoeken in de HD brengt het antwoord, maar het duurt te lang (en ook, het is niet dat betrouwbare, er kunnen andere bestanden met die naam). Dus, als ik het goed begrepen, er is geen gemakkelijke weg. I hebben om te bladeren door al die gekke registersleutels die verandering plaats elke nieuwe release. Is dat juist? In dat geval, ik denk dat ik gewoon te laten vallen. Het niet de moeite waard.
  3. 1

    Ik ben niet zeker of dit werkt elke keer maar voor mij in sql*plus:

    variable n varchar2(200)
    
    execute sys.dbms_system.get_env('NLS_LANG', :n )
    
    print n
    
    AMERICAN_AMERICA.WE8ISO8859P1

    Gewoon het bouwen van een functie-wrapper, subsidie uitvoeren aan de gebruikers die ze nodig heeft, en daar ga je.

    • Na een aantal testen. GET_ENV niet voor de parameters van de cliënt maar van de server-proces. Dus het werkt niet zoals ik gehoopt had. Sorry 🙁
    • Na wat graafwerk vond ik dat de database slaat eigenlijk de opdrachtgever tekenset voor elke aangesloten sessie: SELECTEER sid, client_charset VAN v$session_connect_info;

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *