Vous êtes sur la page 1sur 17

Oracle Heterogeneous Services (HS)

O HS, como conhecido, um componente integrado ao Bando de dados Oracle, que


prov acesso a outros bancos de dados de terceiros.
Para que isso funcione, voc precisa usar ainda um agente complementar ao servio, que tanto
pode ser um Transparent Gateway, que construdo especificamente para a tecnologia do banco
de dados que voc quer acessar, ou um agente genrico, como por exemplo, uma conexo
ODBC.
Ns seguiremos neste documento com a segunda opo.
Ambiente utilizado:
- Windows 10 Enterprise Edition;
- Oracle Database 11g R2 XE;
- MS SQL Server Express 2016 com SP1;
- Apex 5.1;
O objetivo, neste caso, acessar e manipular os dados em uma base de dados SQL
Server, de modo totalmente transparente para um aplicativo Apex, rodando naturalmente, em uma
base de dados Oracle.
Em teoria, a configurao deveria ser simples. E observando os passos necessrios e os
arquivos envolvidos, depois de tudo pronto, realmente bastante simples. O problema que no
to simples assim chegar a estes arquivos finais de configurao, da maneira correta. Existem
muitos posts a respeito e tutoriais completos na web, mas quase todos tratam do assunto usando
verses mais antigas, Linux ou outros bancos de dados. Ento, encontrar o caminho que funcione
com a sua configurao especfica, no to simples quanto parece, e acaba se tornando um
jogo de tentativa e erro, at que se chegue ao resultado desejado.
Felizmente, temos algumas ferramentas da prpria Oracle, que nos ajudam a testar partes
da configurao, antes de prosseguir para o passo seguinte, e ns mesmos, podemos garantir
condies mnimas em que podemos confiar, com outras ferramentas, para que possamos
eliminar logo cedo, dvidas quanto ao funcionamento de um ou outro componente envolvido no
processo.
Dito isso, vamos comear a seguir os passos necessrios para termos a conexo
funcionando e disponvel em nosso ambiente Apex.
O primeiro ponto a notar, que usei no meu ambiente o SQL Server Express. Esta verso
tem uma particularidade. A de no ter uma porta fixa para comunicao via TCP (rede). Aqui,
enfrentei o primeiro problema. Lendo a documentao e outras fontes da web, voc vai descobrir
que existe uma forma de fazer com que ele use uma porta fixa, atravs de configuraes. A
informao que ele no traz por DEFAULT uma porta fixa configurada, mas que isso pode ser
feito.
Pois bem. Acessei as telas mostradas abaixo, no SQL Server Configuration Manager, me
certifiquei de que os protocolos de rede do Express estavam funcionando, e configurei a porta fixa,
conforme dito na documentao. Aqui um ponto importante. Caso o servio TCP/IP esteja
desabilitado, voc precisa habilitar, e reiniciar os servios do SQL Server Express antes de
prosseguir.

Depois da configurao feita, criei uma conexo a partir de outra mquina da rede, com o
SQL Developer, da Oracle, e um drive java, comprovadamente funcional e muito elogiado. Queria
ter certeza de que o SQL Express estava funcionando na rede, antes de prosseguir, pois caso no
conseguisse conectar depois de configurar o HR, poderia pelo menos ter certeza de que no era
nem um problema de rede, nem de porta do SQL Server Express.
Na primeira tentativa de conexo, no funcionou. Na segunda tambm no e nenhuma
mais da em diante, de forma nenhuma. Revisei vrias e vrias vezes a conexo, nmero de
porta, protocolos, e nada. Na mquina local funcionava bem, por usar o agente do prprio banco,
e no uma porta.
Para encurtar, o problema era justamente a porta configurada. No sei o motivo, e francamente,
no procurei saber. No sei se um bug, ou se existe ainda alguma configurao adicional
necessria, mas mesmo seguindo as indicaes de posts e documentao, a porta indicada no
funciona.
Voc ver nas imagens abaixo. A documentao diz que devemos:
- Acessar o protocolo TCP/IP dos servios de rede do SQL Server;
- Encontrar o endereo que nos interessa disponibilizar. No meu caso, o 10.0.1.7, ip do meu
servidor interno;
- Voc deve mudar o valor da propriedade TCP Dynamic Ports, e deixar vazio. Nem mesmo
com zero. Limpar o campo;
- Na propriedade TCP Port, informar a porta que voc quer disponibilizar. Neste caso, 1433;
Simplesmente no funciona. Eu consegui resolver e acessar via rede, atravs da porta
indicada em outro ponto da configurao, mais abaixo, na mesma lista de endereos. Existe no
final desta lista um endereo chamado IPAll, que traz um outro nmero de porta dinmica. Com
este nmero, consegui acessar via rede, sem problemas.
Segue a sequencia de imagens:

Protocolos de rede e a porta modificada no endereo 10.0.1.7.

Aqui, a porta que funcionou, no IPAll.

Eu poderia ter feito outros testes, mas como no meu objetivo principal, e teoricamente, na
verso Full" do SQL Server este problema no deve existir, ento, segui em frente.

O objetivo principal neste caso, ser acessar uma tabela existente, no SQL Server, e manipular
seus dados, atravs de um Database link, criado no ambiente Apex, no Banco Oracle, como se
fosse uma tabela local.

Abaixo, veremos a tabela criada para testes e alguns dados existentes na mesma.

O banco de dados que iremos acessar, tem o incrivelmente criativo nome de Teste, uma tabela
chamada Estados, que possui 5 registros.

O prximo passo criar uma fonte de dados ODBC, de 64 bits.


Neste ponto, preciso muita ateno em dois detalhes importantes:
- A fonte de dados deve ser um DSN de sistema, e no de usurio.
- O nome da fonte de dados deve ser escolhido com cuidado. Ele ser usado nos arquivos de
configurao do HR, e deve ser escrito exatamente da mesma forma nestes arquivos. Ento, se
possvel, escolha um nome curto, fcil de lembrar, significativo em relao a origem dos dados,
e totalmente em letras minsculas ou maisculas. Evite problemas ao misturar letras que
podem ser difceis de lembrar mais adiante.

O Wizard do Windows que cria este DSN muito prtico e intuitivo, mas existem opes que voc
precisa escolher de determinada forma, ou mesmo decidir entrar em determinada tela, para
garantir que a configurao ser feita da maneira necessria. Entre as configuraes, temos:
- Na segunda tela do Wizard, aps a escolha do nome da fonte de dados, escolher a forma de
autenticao do prprio SQL Server, e no a do Windows. Ou seja, usaremos o usurio sa
padro, e a senha determinada para ele no momento da instalao;
- Logo abaixo do boto de rdio de escolha da forma de autenticao, temos um outro boto,
chamado Configurao do Cliente. Precisamos clicar neste boto, para podermos fazer
escolhas diferentes do padro na tela que se abrir em seguida;

- Normalmente, a opo que vem marcada por default nesta tela Pipes Nomeados. Voc deve
escolher TCP/IP;

- Por mais estranho que parea, deixe marcada a opo Determinar porta dinmicamente, a
direita desta tela. Lembre-se, que neste caso, ns iremos nos conectar com a fonte de dados,
atravs de um nome, e no de uma porta. Ento, melhor deixar o prprio sistema usar a porta
que ele considerar adequada. O caso que relatei, no incio deste texto, era para conectar
atravs de outro software, e no do HR da Oracle;
- Nas prximas telas, a nica coisa que alterei, foi o banco de dados padro, que j deixei como
Teste;

Segue a sequncia de telas:

ODBC de 64 Bits. Fonte de dados do Sistema, e no do Usurio.

Nome simples, todo em letras minsculas.

Forma de autenticao, e acesso a configurao do cliente.

Configurao do cliente, como TCP/IP e porta dinminca.

Definio do banco de dados default.

Concluso da criao e configurao do DSN de Sistema.

Deste ponto em diante, o que precisamos fazer exige um editor de texto simples, de sua escolha,
e o uso do prompt de comando do Windows, em modo administrador. Em modo simples, teremos
problemas.

Para configurar o HR e fazer com que acesse a fonte de dados ODBC que acabamos de criar,
precisamos trabalhar com basicamente 3 arquivos, em locais diferentes, reiniciar um servio da
Oracle e iniciar outro. E isso tudo. Mas temos pegadinhas
Para facilitar nossa vida, a Oracle disponibiliza junto com a instalao, alguns arquivos de
exemplo, com a extenso .sample acrescentada, deixando clara a sua funo.
O primeiro local que precisamos acessar, :
C:\oraclexe\app\oracle\product\11.2.0\server\hs\admin
Nesta pasta, temos os arquivos .sample necessrios que nos serviro de base, e um arquivo que
servir para inicializar o servio, ou melhor, o listener que criaremos.

Os arquivos modificados, no ficaro nesta pasta, com exceo de um, que o inicializador do
listener. Os outros dois arquivos, devem ser movidos, depois de alterados, para a seguinte pasta,
que realmente levada em conta na configurao dos servios Oracle:
C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN
Vamos ento a primeira pasta: C:\oraclexe\app\oracle\product\11.2.0\server\hs\ADMIN
Nesta pasta, temos os vrios arquivos de exemplo, e um em especial, que deve ser renomeado, e
permanecer nesta mesma pasta. o arquivo initdg4odbc.ora.sample, que deve ser renomeado
para init<nomedodsn>.ora, alm de editado. No nosso exemplo, ele passar a se chamar
initmssconn.ora, e seu contedo interno ficar assim:
# 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 = mssconn
HS_FDS_TRACE_LEVEL = OFF
#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>
As linhas que mudam so:
HS_FDS_CONNECT_INFO = mssconn
Onde mssconn o nome do nosso DSN recm criado.
HS_FDS_TRACE_LEVEL = OFF
E aqui deve estar como OFF. Seja l o valor que tiver no arquivo de exemplo, mude para OFF.

O prximo arquivo que vamos alterar, o listener.ora.sample. copie para listener.ora apenas, para
preservar o arquivo de exemplo. O contedo dele deve ficar assim:
SID_LIST_LISTENER_MSSCONN =
(SID_LIST =
(SID_DESC =
(SID_NAME = mssconn)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
(PROGRAM = dg4odbc)
)
)

LISTENER_MSSCONN =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = PNPKEY))
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-6QTHL5D)(PORT = 1522))
)
)

As linhas importantes aqui so:


SID_LIST_LISTENER_MSSCONN =
Aqui comea a descrio do novo listener. Note que uma agregao de identificadores. Sendo
assim, o nosso novo listener vai se chamar LISTENER_MSSCONN. Mas abaixo, vamos utilizar
este nome
Ainda no mesmo bloco, temos as linhas:
(SID_NAME = mssconn)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
(PROGRAM = dg4odbc)
Onde:
SID_NAME o nome de nosso DSN novamente. E deve ser escrito exatamente da mesma forma.
ORACLE_HOME o endereo do nosso server.
PROGRAM o programa que faz a comunicao com os servios ODBC. Em muitos posts, o
nome indicado aqui outro, mas por se tratar de verses anteriores. Atualmente, este o nome
correto.

No prximo bloco de configurao, o que nos interessa so as linhas:


LISTENER_MSSCONN =
a primeira linha do bloco, que descreve quais protocolos, host e porta sero atendidos pelo
listener que estamos criando. Deve ter exatamente o nome do Listener, identificado no primeiro
bloco.
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-6QTHL5D)(PORT = 1522))
Protocolo TCP, Host e porta. Note que usamos uma porta diferente da porta padro, que
1521. Deste modo, colocamos o listener do outro banco ouvindo em uma porta diferente.
*** Muito importante! No esquea de abrir uma regra de entrada para esta porta no seu
Firewall. Do contrrio, nada de acesso.
O prximo arquivo o tnsnames.ora, e merece um pouco mais de ateno. Mas isso por um
detalhe que a princpio no muito fcil de encontrar na documentao. Pelo menos, eu no
encontrei.
O arquivo de exemplo que a Oracle disponibiliza, bem mais simples do que veremos a seguir.
Tem poucas linhas. E neste ponto, para piorar, encontramos uma outra fonte de confuso. Aps
terminar de alterar os arquivos, devemos copiar para a pasta final, indicada anteriormente. S que
neste local, j existem arquivos com o formato adequado e a extenso .ora, sem o .sample. E
dentro, as configuraes so coerentes com os servios e listener que esto atualmente em uso
por nosso banco Oracle. Inclusive, vemos ali o XE, que justamente a instncia ativa de nosso
banco de dados. Ento, o que devemos fazer ?
1) Mixar as configuraes:
Tentei, e foi pssimo. No temos bons exemplos disponveis de configurao para mais de
um listener, pelo menos no no mesmo arquivo;
2) Criar arquivos diferentes:
Nada sobre isso tambm. Acredito que seja possvel, mas como fugiria dos nomes
padronizados, provavelmente, precisariamos configurar outros arquivos para identificar nosso
listener. Muito complicado.

Foi ento que, depois de inmeras tentativas, e j quase desistindo, me deparei com uma
resposta de um post, dentre tantas, onde a pessoa relatava justamente este problema. Foi quando
algum comentou que os servios default do banco Oracle, no precisam de arquivo de
configurao, e que teoricamente, se eliminssemos aqueles arquivos, o banco de dados
continuaria funcionado da mesma forma. Se isso fosse verdade, ento, poderamos substituir
completamente os arquivos da pasta pelos arquivos do nosso listener, e no teramos problemas.
Primeiro, fiz um teste. Mudei o nome dos arquivos e das extenses, e reiniciei o banco, j me
preparando para o pior. Surpresa! Tudo funcionando normalmente. Ento a informao estava
correta. No entendi o motivo de ter estes arquivos neste local. Aparenta ser uma contiuao dos
exemplos, como se na primeira pasta ficassem os arquivos de exemplo originais, e nesta ltima,
os arquivos de exemplo modificados, em seu formato final, mas ainda sem funo.
Deixando de lado as suposies, modifiquei o ltimo arquivo, o tnsnames.ora, que ficou assim:
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-6QTHL5D)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)

LISTENER_MSSCONN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-6QTHL5D)(PORT = 1522))
(CONNECT_DATA =
(SID = mssconn)
)
(HS = OK)
)

Neste caso, o que realmente nos interessa o seguinte bloco:


LISTENER_MSSCONN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-6QTHL5D)(PORT = 1522))
(CONNECT_DATA =
(SID = mssconn)
)
(HS = OK)
)
Este bloco relativo ao nosso listener. Se houver mais linhas a partir da, apague. O arquivo deve
ficar exatamente desta forma.
Note novamente o nome do listener no incio do bloco, o protocolo, o nome do host e a porta
escolhida. Mais abaixo, temos o SID, que novamente, o nome da nossa fonte de dados ODBC.
No esquecer da linha HS = OK, que ativa realmente os heterogeneous services.

Agora, com tudo configurado, precisamos reiniciar o servio de listener do Oracle, e iniciar o
nosso listener. Abra uma janela de linha de comando do windows, em modo administrador, e
vamos l. Digite os seguintes comandos:
- lsnrctl reload (para reiniciar os servio de listener)
- lsnrctl start listener_mssconn (para iniciar o nosso listener)
Tudo estando configurado corretamente, voc ver uma srie de linhas de diagnstico,
indicando que est tudo ok. Podemos ver novamente este resultado, com o seguinte comando:
lsnrctl status listener_mssconn
O resultado deve ser este:

Este comando confirma o nome do listener, informa a quanto tempo est funcionando, bem como
o arquivo de configurao que est sendo usado (C:
\oraclexe\app\oracle\product\11.2.0\server\network\admin\listener.ora), o servidor, protocolo e
porta. Tudo ok.

Tambm podemos fazer outro teste para ter certeza de que a conexo possvel, antes de
partirmos para o Apex. Digite o comando:
tnsping listener_mssconn 5
O resultado dever ser este:

O comando tenta conectar a fonte de dados, envia 5 pings, mede o tempo e informa o resultado.
Tudo ok tambm.

Voc pode ainda fazer testes e criar um database link diretamente usando o utilitrio de linha de
comando sqlplus, mas vamos direto ao Apex para abreviarmos o processo.
Antes de poder criar o Database link, voc deve dar a permisso ao schema, ou nome do
workspace onde voc pretende cria-lo, com o comando grant, utilizando o sqlplus, conectado
como sysdba. Assim:
grant create database link to <nome_do_workspace_apex>;

J no ambiente do Apex, na aba SQL Workshop, em Object Browser, voc pode usar um
Wizard e criar um Database link para utilizar nos reports e forms do seu aplicativo. Mas
francamente, o wizard traz algumas opes a mais, que no consegui utilizar da maneira correta.
Assim, preferi usar um comando direto, na aba SQL Commands, do SQL Workshop. O comando
este, muito simples:
CREATE DATABASE LINK MSSERVER50" CONNECT TO SA" IDENTIFIED BY SENHA"
USING listener_mssconn;
O resultado a criao de um Database link, com o nome MSSERVER50, que voc pode usar
em qualquer query sql da em diante. Usando o nosso banco de dados de exemplo do SQL
Server, uma consula a tabela estados, ficaria assim:
SELECT * FROM estados@msserver50;
Abaixo, as telas finais da configurao:

Criao do Database Link.

Depois de criar um Interactive Report no Apex, usar como fonte de dados um SQL Query, no
formato do exemplo.

O resultado final, ser um relatrio e formulrio usando a tabela estados do SQL Server como se
fosse uma tabela nativa do Oracle.

At o momento no percebi nenhuma diferena de tratamento ou de performance, mas claro


que apenas uma tabela pequena de teste. Mas relatos em fruns tambm confirmam que o
desempenho continua excelente.
Em relao ao tratamento dos dados, a nica diferena que v foi usando a linha de comando
diretamente, onde as colunas precisam estar entre aspas, do contrrio, comandos de update ou
insert no funcionam.

isso. O resultado final realmente simples. Infelizmente, alguns pontos no to bem


documentados ou explicados, transformam uma tarefa que poderia ser relativamente fcil, em
algo desnecessariamente complicado. Ento, justamente por isso, pretendo continuar
documentando sempre que possvel estes pequenos detalhes, mas que so to importantes para
que possamos realmente usar os recursos que temos a disposio.