conexao Delphi x Oracle

849 views
Skip to first unread message

Felipe Dal Pizzol

unread,
Aug 12, 2011, 12:02:56 AM8/12/11
to dug...@googlegroups.com
Buenas galera.

Estou desenvolvendo um sistema que rolou perfeitamente em firebird.

Eis que estou tentando utilizá-lo para outros bancos, como o SQLServer
(2008 Express Edition) e  o Oracle (XE).

Bom, pra começo de conversa, instalei o sql server, o management studio,
mas a bagaça nao funcionou pra ninguem (windows7 64 bits). Abandonei por
enquanto, pra nao perder muito tempo...

No Oracle, usei a ferramenta web e o sql plus, criei meu banco de dados,
inclui dados iniciais via script e consigo efetuar consultas. Porém,
quando vou tentar conectar com pelo DBX (TSQLConnection), da a mensagem
de erro seguinte:

    ORA-12154: TNS:não foi possível resolver o identificador de conexão especificado

Dei uma pesquisada por cima, mas como o tempo está esguelado pra pesquisas,
e nao consigo uma dedicação como deveria, peço dicas pra quem possivelmente
ja tenha passado por isso.
O oracle foi instalado padrão e nao modifiquei nada nos arquivos tnsnames.ora,
sqlnet.ora e listener.ora.

Quem puder me passar um help, agradeço!!

ABraço!
Dal Pizzol.

--
Felipe Dornelles Dal'Pizzol

Anderson Dapper

unread,
Aug 12, 2011, 12:16:24 AM8/12/11
to dug...@googlegroups.com

ORA-12154

Erro onde não há um Listener para conexão, porém, ele é emitido dentro do banco de dados Oracle, por isso o motivo do ORA no início, e esse erro é quando se está utilizando um DBLINK para um determinado banco de dados e o ALIAS utilizado no DBLINK não corresponde ao banco de dados. Exemplo:

SQL> select count(*) from NOTAS_FISCAIS@RANET_SP.WORLD;
select count(*) from NOTAS_FISCAIS@RANET_SP.WORLD
                                   *
ERRO na linha 1:

ORA-12154: TNS:could not resolve service name

Solução

A solução para esse tipo de problema é igual ao do TNS-12154, porém necessita de mais detalhes, como:

Verificar qual o alias que o DBLINK está utilizando para realizar a comunicação, fazendo o SELECT abaixo:

SQL> select owner, db_link, username, host from dba_db_links;

OWNER      DB_LINK         USERNAME                       HOST
---------- --------------- ------------------------------ ---------------
PUBLIC     RANET_SP.WORLD   dbara                             RANET_RO

1 linha selecionada

A coluna HOST fornece o nome do alias que será utilizado para realizar a comunicação com outro banco de dados. Esse alias é o mesmo encontrado no arquivo tnsnames.ora, então, para resolver o problema, basta no arquivo de tnsnames colocar um alias chamado RANET_RO para o hostname, porta e SID corretos, deste modo o DBLINK volta a funcionar. Existem outras coisas que devemos prestar atenção como mencionado nos erros TNS acima, como:

  1. Verificar se é necessário utilizar o .WORLD para o domínio global;
  2. Verificar o NAMES.DIRECTORY_PATH e NAME.DEFAULT_DOMAIN do sqlnet.ora do servidor de banco de dados;
  3. Executar os testes de PING e TNSPING.
Att,
Anderson Dapper Rocha



--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs

Felipe Dal Pizzol

unread,
Aug 12, 2011, 12:25:16 AM8/12/11
to dug...@googlegroups.com
Gracias Anderson.

Nesse caso, é tudo local, desenvolvimento e banco... logo, o tnsping funciona
e conexao com sql*puls tambem. Quanto ao DBLink, não tem nada que eu tenha
especificado. Talvez seja algo que não estou lembrando de corrigir.

Quanto aos itens 1 e 2,tem como me economizar tempo e passar o que eu tenho
que informar? Dia desses, mexi na questão do .WORLD, mas agora nao lembro
onde foi... acho que no sqlnet.ora.
  • Verificar se é necessário utilizar o .WORLD para o domínio global;
Quanto ao item abaixo, até vi informação que tem que incluir no sqlnet.ora, em
pesquisa no google, mas nao achei a forma de setar isso.
  •  Verificar o NAMES.DIRECTORY_PATH e NAME.DEFAULT_DOMAIN do sqlnet.ora do servidor de banco de dados;

Tem mais alguma dica?

Felipe.

Everton Lucas

unread,
Aug 12, 2011, 7:36:51 AM8/12/11
to dug...@googlegroups.com
Felipe

Como tu estás montando a string de conexão?

--
Abraço
Everton Lucas

Felipe Dal Pizzol

unread,
Aug 12, 2011, 10:55:24 AM8/12/11
to dug...@googlegroups.com
Everton, está tudo sendo feito pela tela avançada do SQLConnection
(Delphi 2010), mas agora não consigo te passar. Sei que o banco que
informei é XE, e o usuário, BancoTestes.

Felipe.

Em 12/08/11, Everton Lucas<evtl...@gmail.com> escreveu:

>> *ORA-12154*


>>>
>>> Erro onde não há um Listener para conexão, porém, ele é emitido dentro do
>>> banco de dados Oracle, por isso o motivo do ORA no início, e esse erro é
>>> quando se está utilizando um DBLINK para um determinado banco de dados e
>>> o
>>> ALIAS utilizado no DBLINK não corresponde ao banco de dados. Exemplo:
>>>
>>> SQL> select count(*) from NOTAS_FISCAIS@RANET_SP.WORLD;select count(*)
>>> from NOTAS_FISCAIS@RANET_SP.WORLD

>>> *ERRO na linha 1:


>>> ORA-12154: TNS:could not resolve service name
>>>

>>> *Solução*


>>>
>>> A solução para esse tipo de problema é igual ao do TNS-12154, porém
>>> necessita de mais detalhes, como:
>>>
>>> Verificar qual o alias que o DBLINK está utilizando para realizar a
>>> comunicação, fazendo o SELECT abaixo:
>>>
>>> SQL> select owner, db_link, username, host from dba_db_links;
>>>
>>> OWNER DB_LINK USERNAME HOST
>>> ---------- --------------- ------------------------------ ---------------
>>> PUBLIC RANET_SP.WORLD dbara RANET_RO
>>> 1 linha selecionada
>>>
>>> A coluna HOST fornece o nome do alias que será utilizado para realizar a
>>> comunicação com outro banco de dados. Esse alias é o mesmo encontrado no
>>> arquivo tnsnames.ora, então, para resolver o problema, basta no arquivo
>>> de
>>> tnsnames colocar um alias chamado RANET_RO para o hostname, porta e SID
>>> corretos, deste modo o DBLINK volta a funcionar. Existem outras coisas
>>> que
>>> devemos prestar atenção como mencionado nos erros TNS acima, como:
>>>

>>> 1. Verificar se é necessário utilizar o .WORLD para o domínio global;
>>> 2. Verificar o NAMES.DIRECTORY_PATH e NAME.DEFAULT_DOMAIN do


>>> sqlnet.ora do servidor de banco de dados;

>>> 3. Executar os testes de PING e TNSPING.

Everton Lucas

unread,
Aug 12, 2011, 2:14:11 PM8/12/11
to dug...@googlegroups.com
Felipe

Digita aqui a linha de comando que tu usa para conectar com o sqlplus.

--
Abraço
Everton Lucas

Felipe Dal Pizzol

unread,
Aug 12, 2011, 3:10:59 PM8/12/11
to dug...@googlegroups.com
conn BaseOraTestes/INTERNACIONAL@XE

OBS: A senha não tem nada a ver com o problema :D

Everton Lucas

unread,
Aug 12, 2011, 4:01:40 PM8/12/11
to dug...@googlegroups.com
E pq no SQL Connection vc está informando BancoTestes e no sqlplus BaseOraTestes?
Abraço
Everton Lucas

Felipe Dal Pizzol

unread,
Aug 12, 2011, 4:38:45 PM8/12/11
to dug...@googlegroups.com
Everton, foi mosqueada minha... eu estou passando o nome do usuario
mesmo... um conforme o outro, mas como não estou com o projeto por
aqui, acabei jogando ali uma coisa estranha.

O usuario é : BancoORATestes
Logo, a conexão: BancoORATestes/INTERNACIONAL@XE

Na SQLConnection:
DataBase = XE
Usuario = BancoORATestes
Senha = INTERNACIONAL

Everton Lucas

unread,
Aug 12, 2011, 4:43:42 PM8/12/11
to dug...@googlegroups.com
Tenta colocar no database 127.0.0.1/xe

Felipe Dal Pizzol

unread,
Aug 15, 2011, 11:33:23 PM8/15/11
to dug...@googlegroups.com
Permita-me o Vitor Rubio enviar um post completo do blog dele, mas que
é muito útil para desenvolvedores Delphi + Oracle.

Solucionou meu problema e entendo como sendo um paliativo interessante,
até que se encontre uma solução mais aceitável.

E essa dica realmente funciona. Fiz os testes e está rolando direitinho,
apesar de nao gostar de ter que copiar toda a pasta do delphi... heheh

O link é o seguinte:
http://blog.vitorrubio.com.br/2011/07/erro-ora-12154-tns-nao-foi-possivel.html

O texto, em sua íntegra é o seguinte:

Aqui abro guampas: "

sexta-feira, 15 de julho de 2011

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Para se conectar uma aplicação Delphi no Oracle é necessário editar o arquivo tsnames.ora, geralmente na pasta C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN caso seu oracle seja o XE.
Esse erro pode acontecer tanto em runtime como em design-time, com qualquer tipo de componente: DBX, ADO e assim por diante. É mais comum que aconteça em tempo de design em um windows de 64 bit. 
Em alguns casos onde essa mensagem de erro aparece é porque o arquivo não existe ou está em uma pasta que o Delphi ou o seu aplicativo não tem permissão de acesso. 
Na grande maioria dos casos o erro ocorre apenas em design-time e nunca em runtime. Se esse é o seu caso  então provavelmente a culpa é do windows de 64 bit, mais especificamente o fato de o Delphi estar instalado na pasta "Arquivos de Programas (x86)". Explicando, o driver de conexão ao oracle não suporta caminhos contendo parênteses "()", esses que tem no "(x86)". Ele não consegue encontrar nem o driver de conexão nem o arquivo tsnames.ora por causa desses parênteses. Instale o Delphi em uma pasta tipo "Arquivos de Programas" "normal" ou até mesmo em uma pasta direto na raiz, como c:\Delphi.
Se o Delphi já está instalado nesta pasta problemática ainda assim é possível copiar toda a pasta do RAD STUDIO (geralmente C:\Arquivos de programas (x86)\Embarcadero\RAD Studio) para uma pasta qualquer, tipo c:\rad studio, e execute o Delphi dali. (ele se encontra na pasta 7.0\bin se for o 2010 ou 8.0\bin se for o XE, é o arquivo bds.exe).
Ele vai executar normalmente, mesmo no local "errado", já que tudo que ele precisa em matéria de bibliotecas está no registro e ele consegue encontrar no diretório original, e isso não impedirá de que uma conexão DBX com o oracle funcione normalmente. Vai funcionar mesmo em design-time, e compilar sua aplicação normalmente.

Have fun ;)

" <-- Aqui fecho guampas

--
Felipe Dornelles Dal'Pizzol

Reply all
Reply to author
Forward
0 new messages