Determinar o conjunto de caracteres do cliente de sessão Oracle?

9

Eu sei como o conjunto de caracteres do banco de dados ( NLS_CHARACTERSETin select * from v$nls_parameters;) e o conjunto de caracteres do cliente (a configuração do ambiente do cliente NLS_LANG) interagem.

No entanto, o que não consigo descobrir é como ou se posso determinar, para uma sessão estabelecida , qual é o Oracle que o conjunto de caracteres do cliente atual é.

Isso é possível em tudo?

Nota: SELECT * FROM NLS_SESSION_PARAMETERS;se não incluir o conjunto de caracteres (em 10G2).

Para deixar absolutamente claro o que eu gostaria de realizar:

  1. NLS_LANG é definido no ambiente do cliente com um valor arbitrário (por exemplo GERMAN_GERMANY.WE8MSWIN1252)
  2. O aplicativo de banco de dados [*] inicia e estabelece uma conexão / sessão com o banco de dados Oracle.
  3. O aplicativo de banco de dados [*] deseja "perguntar" à Oracle (não ao ambiente do SO) qual será o conjunto de caracteres do cliente que a Oracle assumirá.

[*]: Se o aplicativo db for sqlplus, o exemplo seria da seguinte maneira:

...
sqlplus /nolog
connect user/pass@example
*magic command*;
   CLIENT CHARACTERSET = ...

A nota de Jack em sua resposta levanta dois pontos importantes:

  • Com o Oracle, quem faz a tradução do conjunto de caracteres. É o código da biblioteca do cliente ou é feito no lado do servidor?
  • Como parece ser o cliente, o cliente precisaria expor essa configuração - qual a lib / ferramenta do cliente assume essa configuração. Existe alguma das bibliotecas / ferramentas do cliente Oracle (sqlplus, OCI / OCCI, Pro * C, ...) que pode ser consultada sobre o que ela acha que é essa configuração?
Martin
fonte

Respostas:

9

Tenho um pouco de dúvida de que é exatamente isso que você está procurando, mas

host echo %nls_lang%;

ENGLISH_UNITED KINGDOM.WE8ISO8859P1

mostra a variável de ambiente nls_lang do cliente no cliente.

Eu não acho que haverá uma consulta SQL que você possa executar para fornecer a configuração 'atual' porque o servidor AFAIK não está ciente de que tradução é feita no lado do cliente; portanto, qualquer comando para mostrar a configuração atual precisará ser nativo para o cliente - usei o SQL Developer para o comando acima, mas presumo que ele funcionará da mesma maneira no SQL * Plus

--editar

de AskTom :

somente o cliente conhece seu conjunto de caracteres também - ele não está disponível "no banco de dados"

e

o conjunto de caracteres descreve o que é armazenado no banco de dados.

o cliente transmite o conhecimento desejado ao caractere [sic] para o banco de dados através da configuração NLS_LANG.

Se você estava no 11.1+, pode se divertir com v $ session_connect_info, porque:

Esta informação é enviada por OCI para o servidor no momento do login.

Mas eu descobri que ainda dependeria de como você está se conectando, por exemplo, a partir do JDBC Thin Driver, você não está usando OCI e, portanto, as informações não são enviadas.

Jack diz que tenta topanswers.xyz
fonte
Bem, não, não é exatamente o que eu estava procurando :-) - Mas você levanta um (dois) ponto (s) importante (s) e, se for verdade, acho que seria uma resposta aceitável. Vou adicionar os dois pontos à pergunta.
Martin
Bah! (para não culpar você) Mas a Oracle realmente entende : "somente o cliente conhece seu conjunto de caracteres - ele não está disponível" no banco de dados " " e "o cliente divulga o banco de dados por meio do NLS_LANG" are realmente dizendo o contrário, não? :-)
Martin
Sim, você está certo, apesar de Tom <> Oracle. Eu acho que ele está tropeçando em suas palavras - esse segmento inteiro é bem a pena desnatação ...
Jack diz tentativa topanswers.xyz
11
Resposta aceita para o 1º link - porque esta pergunta em Ask Tom (de 2002) realmente pergunta a mesma coisa "Gostaria de saber se é possível verificar as configurações NLS_LANG do lado do cliente em qualquer uma das visualizações v $ ou nls_ depois de conectadas a o banco de dados."
Martin
0

Você pode ver o seguinte :

  • NLS_CALENDAR
  • NLS_CURRENCY
  • NLS_DATE_FORMAT
  • NLS_DATE_LANGUAGE
  • NLS_SORT
  • NLS_TERRITORY

Por exemplo:

SQL> select sys_context('USERENV', 'NLS_TERRITORY') from dual;

SYS_CONTEXT('USERENV','NLS_TERRITORY')
--------------------------------------------------------------------------------
UNITED KINGDOM

1 row selected.
Gaius
fonte
Eu acho que mencionar sys_context aqui é útil. Caso contrário, isso não resolverá o problema de qual conjunto de caracteres .
Martin
O que quero dizer é que essas são as únicas coisas que o servidor conhece (ou se importa).
Gaius