Procedure com DBLink

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
atb
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 08 Jan 2008 8:33 am
Localização: SP
Adriano Barone

Bom dia!

Pessoal, tenho um problema casca para resolver e não estou conseguindo.

Tenho uma package PL/SQL, onde há um cursor lendo duas tabelas via DBLINK. E o restante da rotina faz vários inserts e updates em tabelas do proprio banco de dados, ou seja, o DBLINK é só para leitura.

O processo começa funcionando bem, é executado algumas vezes, e de repente..... TRAVA.

Depois disso não funciona mais, o engraçado é que não fica nenhuma sessão presa no banco, mas o processo só volta a funcionar se baixar o DB.

E tem mais, todos os outros processos e transações continuam funcionando normalmente, só pára de funcionar a rotina que lê o DBlink, inclusive se você rodar o mesmo select do cursor onde acesso o DBlink, retorna extremamente rápido, ou seja, a query não trava.

Um DBA analisou e disse que esse processo está enchendo a cache do DB, não sou DBA, mas se isso fosse verdade o DB todo pararia? Por que somente um processo fica travado?

alguém tem uma luz no fim do túnel, aí? rs

Desde já, muito obrigado.

Adriano Barone
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Adriano,

Posso dar uma sugestão?

Se você está usando o DBLINK para ser executado dentro de procedures, eu sugeriria para você "forçar" o fechamento do DBLINK depois de seu uso na procedure.

Basicamente, você utilizaria o seguinte comando dentro do PL/SQL:

Selecionar tudo

EXECUTE IMEDIATE('ALTER SESSION CLOSE DATABASE LINK <nome_dblink>');
Se você está usando o DBLINK em queries do SQL*PLus, então tente executar este comando:

Selecionar tudo

ALTER SESSION CLOSE DATABASE LINK <nome_dblink>;
Verifique se tomando este cuidado você consegue reduzir as ocorrências onde o DBLINK "trava".

Tanto em caso positivo como negativo, poste aquí o resultado.

Abraços,

Sergio Coutinho
atb
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 08 Jan 2008 8:33 am
Localização: SP
Adriano Barone

Ok, obrigado pela dica.

Mas tenho umas dúvidas em relação a este procedimento.

Hoje eu tenho uma package compilada no banco de dados onde existe um cursor que acessa das views do dblink.

Caso eu feche o dblink, essa view não vai ficar inválida e deixar de compilar?

Caso não tenha esse problema, a idéia seria no incício da procedure eu inciaria o dblink e no término eu o fecharia, seria isso?

Obrigado.

Adriano Barone
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Adriano,

O fechamento do DBLINK não significa que o mesmo deixará de existir, ou que as views que se utilizam dele ficarão inválidas.

O objetivo de se fechar um DBLINK é o de somente garantir que não existam transãções ou sessões de DBLINK pendentes, após o uso do DBLINK.

Faça o seguinte teste, se ainda está com dúvidas.
- Abra uma sessão SQL;
- Faça um select em uma view que acesse o DBLINK;
- Feche a sessão de DBLINK com o comando ALTER SESSION ...
- Execute novamente o SELECT na view;

Abraços,

Sergio Coutinho
atb
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 08 Jan 2008 8:33 am
Localização: SP
Adriano Barone

Entendi, perfeito.

Mas só uma outra dúvida, como fazer isso dentro da rotina pl/sql, o comando

Selecionar tudo

EXECUTE IMEDIATE('ALTER SESSION CLOSE DATABASE LINK <nome_dblink>')
não compilou na procedure.

Se eu rodar isso no forms, funciona do mesmo jeito?

Selecionar tudo

forms_ddl('ALTER SESSION CLOSE DATABASE LINK <nome_dblink>');
Outra coisa, eu tenho que enviar o comando para "abrir" o dblink antes de usa-lo, ou não é necessário?

Muito obrigado.

Adriano Barone
atb
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 08 Jan 2008 8:33 am
Localização: SP
Adriano Barone

Já vi o motivo de não compilar, o comando correto é EXECUTE IMMEDIATE.
Só fica a duvida do forms (se posso executar pelo forms) e a de "abrir" o dblink antes do uso.

Obrigado.

Adriano Barone
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Adriano,

Desculpe o deslize pela grafia incorreta do comando do EXECUTE.

Não sou especialista em forms, mas se você pode executar procedures pelo forms, conseguirá executar o EXECUTE IMMEDIATE.

O DBLINK será "reativado" quando você executar o SELECT na VIEW pela primeira vez após ter executado o comando de CLOSE do DBLINK. Para o banco, isso é um processo transparente.

Abraços,

Sergio
atb
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 08 Jan 2008 8:33 am
Localização: SP
Adriano Barone

Bom dia!

Imagine, não esquenta, obrigado pela ajuda!

Entendi o conceito do comando, inclusive já alterei a rotina para executá-lo ao término do processamento.

Agora como o problema é itermitente não consigo ter certeza que resolvel, só em alguns dias de uso, se não travar mais é que funcionou.

De qualquer maneira, muito obrigado pela ajuda.

Um bom natal e ano novo para todos!

Adriano Barone
Responder
  • Informação