quinta-feira, 30 de julho de 2009

Acessando planilhas do excel através do Oracle

Minha cabeça expludiu, rs, perdi algumas horinhas pra achar um jeito de popular algumas tabelas com dados dentro de planilhas do excel, sem ter a necessidade de qualquer modificação no xls ou usar algum software de terceiros. A solução encontrada foi: Conectar na planilha através de um dblink, configurado pelo com listener através de fontes de dados ODBC.
OBS - Conexões Oracle/Terceiros é chamada de Generic Heterogeneous Services.

Muito simples de ser feito, envove as seguintes etapas:

  1. Criar o odbc pra planilha;
  2. Configurar o listener/tnsnames.
  3. Configurar o parametro HS_FDS_CONNECT_INFO em $ORACLE_HOME/hs/admin/initXXX.ora.
  4. Reload do listener.
  5. Criar o DB link.
1) Criar o odbc:



2) Configurar o listener/tnsnames

OBS - As modificações necessárias estão em negrito.

tnsnames.ora:


XE =

(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dhnomura)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)


testing_hs = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = dhnomura)(PORT = 1521)) ) (CONNECT_DATA =(SID = testing_hs) (SRVR = DEDICATED) ) (HS = OK) )





listener.ora:

SID_LIST_LISTENER =

(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = c:\oraclexe\app\oracle\product\10.2.0\server\)
(PROGRAM = extproc)
)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
(PROGRAM = extproc)
)
(SID_DESC = (SID_NAME = testing_hs) (ORACLE_HOME =c:\oraclexe\app\oracle\product\10.2.0\server\) (PROGRAM = hsodbc) )
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
(ADDRESS = (PROTOCOL = TCP)(HOST = dhnomura)(PORT = 1521))
)
)
DEFAULT_SERVICE_LISTENER = (XE)




3) Configurar o parametro HS_FDS_CONNECT_INFO em $ORACLE_HOME/hs/admin/initXXX.ora.

Se torna necessário criar o arquivo $ORACLE_HOME/hs/admin/intiXXX.ora substituindo os xxx do nome pelo nome dado nos tnsnames.ora e listener.ora no sid_name, no caso ficará como:

$ORACLE_HOME/hs/admin/inittesting_hs.ora

Adicionar as entradas no arquivo:


# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent.
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = ts
HS_FDS_TRACE_LEVEL = 0
#
# Environment variables required for the non-Oracle system
#
#set =


OBS - HS_FDS_CONNECT_INFO é igual ao nome dado a fonte de dados ODBC.

4) Reload ou stop/start do lister.



LSNRCTL> reload
Estabelecendo conexπo com (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_X
E)))
O comando foi executado com Ωxito


5) Criar os db link:



SQL> create database link excel using 'testing_hs’;

Database link created.




Agora como teste final acessar os dados da planilha:

SQL> select count(*) from Planilha1$@excel;

COUNT(*)
----------
664



Obs - Planilha1 é o nome da planilha e não o nome do arquivo em sí.

Nenhum comentário: