terça-feira, 7 de setembro de 2010

Oracle 10g x64 + Windows x64 + MS SQL Server = DG4ODBC

Olá,
No artigo de julho/2009, eu demonstrei através de um exemplo prático como realizar uma conexão entre o Oracle 11g e PostgreSQL através do DG4ODBC no Linux. Neste artigo irei apenas relatar minha experiência na realização de configuração de uma conexão heterogênea entre um Oracle 10g x64 instalado em um Windows Server 2003 x64 e um MS SQL SERVER 2000. Bom, após finalizada as configurações e do teste de conectividade via ODBC, o último passo foi a criação do Database Link. Após várias tentativas de realizar a conexão, sempre o erro abaixo era emitido:
 

ORA-28545: error diagnosed by Net8 when connecting to an agentUnable to retrieve text of NETWORK/NCR message 65535
ORA-02063: preceding 2 lines from MSSQLSERVER



De acordo com erro acima, verifiquei várias vezes os arquivos de configuração LISTENER.ora, TNSNAMES.ora entre outros, para checar se havia algum erro de sintaxe. Enfim, após várias tentativas sem sucesso, liguei para um colega de trabalho e pedi para ele testar os arquivos de configuração em um Oracle XE que eu tinha instalado na minha máquina. Conclusão: O teste foi bem sucedido entre o Oracle XE e o SQL Server. Então chegamos a conclusão de que o problema poderia ser por causa da versão 64 bits, tanto do Oracle, quanto do Windows. Enfim, meu colega sugeriu verificar a existência do executável HSODBC no diretório %ORACLE_HOME/bin e aí veio a surpresa. O arquivo não existia. Após verificarmos a documentação, vimos que o Oracle 10g x64 não disponibilizava o executável HSODBC e que uma conexão heterogênea somente poderia ser feita através do DG4ODBC.

Foi aí então que instalei separadamente o Oracle Database Gateway for ODBC 11.2.0.1.0, refiz as configurações necessárias e alterei a linha [PROGRAM = HSODBC] para [PROGRAM = DG4ODBC] no arquivo LISTENER.ora criado no diretório NETWORK/ADMIN do ORACLE_HOME do software Oracle Database Gateway. Sucesso! A conexão foi realizada sem qualquer problema utilizando as configurações abaixo:




================================================
Caminho: C:\DG4ODBC\product\11.2.0\tg_1\hs\admin
Arquivo: initsqlserver.ora
================================================
# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = sqlserverdsn
HS_FDS_TRACE_LEVEL = OFF

#
# Environment variables required for the non-Oracle system
#
#set =

=====================================================
Caminho: C:\DG4ODBC\product\11.2.0\tg_1\NETWORK\ADMIN
Arquivo: listener.ora
=====================================================
SID_LIST_LISTENER_DG4ODBC =
  (SID_LIST =
    (SID_DESC = 
      (SID_NAME = SQLSERVER)
      (ORACLE_HOME = C:\DG4ODBC\product\11.2.0\tg_1) 
      (PROGRAM = DG4ODBC)
    )
  )

LISTENER_DG4ODBC =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    )
  )

ADR_BASE_LISTENER_DG4ODBC = C:\DG4ODBC\product\11.2.0\tg_1

====================================================
Caminho: C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN
Arquivo: tnsnames.ora
====================================================
MSQLSERVER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
    (CONNECT_DATA =
      (SID=SQLSERVER)
    )
    (HS=OK)
  )


No mais, para quem for utilizar o serviço heterogêneo de conectividade "heterogeneous services" (hsodbc) para a realização de conexão entre um banco de dados Oracle e um banco de dados não-oracle, perceberá que não só no Oracle 11g o programa hsodbc foi substituído pelo dg4odbc (Database Gateway for ODBC), mas também nas versões 64 bits do Oracle 10g.