Software Design

Design de software em C, C++, Java, etc…

C++ Oracle Client – Erro de timezone ( ORA-01804 )

Recentemente precisei instalar um serviço que utiliza banco de dados Oracle e começamos a ter a mensagem de erro: Error: ORA-01804: failure to initialize timezone information.

O serviço foi compilado com a oracle instant client 11.2.0.1, porém já tinha uma instalação do Oracle 10g na máquina onde estávamos implantando o serviço. À princípio isso não deveria ser um problema porque os arquivos .so dos 2 clients tem nomes diferentes e o instant client da versão 11 consegue conversar com a versão 10.

Um colega achou que o problema pudesse estar relacionado com a versão e então re-compilamos o serviço, desta vez linkando com a instant client 10.2.0.4, só que isso acabou gerando outras incompatibilidades ( com a biblioteca de abstração de banco que utilizamos ).

Após horas pesquisando na internet eu encontrei uma observação sutil na documentação do IC que fez toda a diferença:

The ORACLE_HOME environment variable no longer determines the location of Globalization Support, CORE, and error message files. An OCCI-only application should not require ORACLE_HOME to be set. However, if it is set, it does not have an impact on OCCI’s operation. OCCI will always obtain its data from the Data Shared Library. If the Data Shared Library is not available, only then is ORACLE_HOME used and a full client installation is assumed. When set, ORACLE_HOMEshould be a valid operating system path name that identifies a directory.

Environment variables ORA_NLS33ORA_NLS32, and ORA_NLS are ignored in the Instant Client mode.

In the Instant Client mode, if the ORA_TZFILE variable is not set, then the smaller, default, timezone.dat file from the Data Shared Library is used. If the largertimezlrg.dat file is to be used from the Data Shared Library, then set the ORA_TZFILE environment variable to the name of the file without any absolute or relative path names. That is, on Linux and UNIX:

Você deve estar se perguntando o que é a tal de “Data Shared Library”? É o arquivo libociei.so ( ou oraociei10.dll no windows ).

O que estava acontecendo no nosso ambiente era que essa shared library não estava presente no sistema e, quando isso acontece, o Oracle tenta pegar as informações como timezone ( entre outras ) do ORACLE_HOME. Como o ORACLE_HOME apontava para uma instalação da versão 10 da biblioteca do Oracle, acontecia esse problema.

Portanto, bastou copiar a libociei.so para o servidor e rodar o serviço novamente que o erro de timezone não aconteceu mais.

Referência: http://docs.oracle.com/cd/B19306_01/appdev.102/b14294/install.htm

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às novembro 27, 2012 por em C++, Database, Oracle e marcado , .
%d blogueiros gostam disto: