Executando uma procedure dentro de outra independente

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
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Pessoal, estou tentando executar o seguinte:

Tenho a procedure TEST que executa a sua rotina e no meio dessa rotina em preciso chamar a procedure EST, executar seu conteúdo, efetuar commit de forma autônoma (eu disparo o commit ao final da procedure EST) em relação a rotina TEST.

Eu tentei no incio da procedure EST embutir o seguinte comando:

Selecionar tudo

PRAGMA AUTONOMOUS_TRANSACTION;
Mas quando eu efetuo a chamada da procedure EST de dentro da procedure TEST dispara o seguinte erro:

Selecionar tudo

ORA-00164:
	distributed autonomous transaction disallowed within migratable distributed transaction
Alguém já precisou fazer algo assim e conseguiu de forma mais transparente?

Valeu.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, beleza?

Apesar do tópico meio antigo, segue abaixo um exemplo de Autonomous que pode ajudar nessa solução:



http://www.oracle-base.com/articles/mis ... ctions.php

qualquer coisa, manda pra gente.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 319
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Cara,

Recentemente precisei utilizar o recurso de transação autonoma para executar um comando DDL dentro de um transação onde já havia sido startado um script DML. Era para alterar as configurações regionais da máquina onde seria executado o objeto em questão. Foi uma solução alternativa para corrigir problemas de configurações regionais, ou mais conhecida, como "gambiarra", pois foi um recurso necessário devido as restrições de acesso a algumas informações e módulos do sistema. Agora porque eu estou lhe contado esse caso, porque funcionou!

Mas para conseguir fazer isso eu consultei uma série de materiais que eu juntei e cujo os quais vou fazer algumas citações, por isso, qualquer crédito referente as citações dos artigos devem ser atribuídos ao autor.

Como o trecho do seu código não ficou muito claro para mim, eu não sei se você está querendo fazer uma transação autonoma a partir de um bloco anônimo ou criar um objeto com esta diretiva, se for a segunda opção a sintaxe e a seguinte:

Selecionar tudo


CREATE OR REPLACE PROCEDURE <NOME_STORED_PROCEDURE>(<PARAMETROS>)
IS PRAGMA AUTONOMOUS_TRANSACTION;

Eu não sei para qual fim você precisa utilizar, mas saiba que existem ressalvas a serem feitas.

Primeiramente esse recurso esta disponível a partir do Oracle 8i, e outra que dependendo do que você pretende fazer existe "riscos" na utilização dessa diretiva, isso porque o "pragma autonomous_transaction" que nada mais é que uma forma de isolar uma transação de outra. O que isso quer dizer que:

Selecionar tudo


"Uma Transação Autônoma é uma transação que é inicializada por outra transação, e opera de modo independente da transação que a invocou. A transação autônoma sempre deve terminar antes de devolver o controle do processo para transação que a invocou. E se a transação autônoma terminar com commit os dados serão gravados no banco de dados ainda que e a transação principal falhe e realize um rollback."

"Deve ficar claro que uma transação autônoma não sabe nada da transação que a invocou, então atualizações feitas dentro de um contexto de transação não serão visíveis pela transação autônoma. Caso uma transação faça inserção em um registro, e logo depois invoque uma transação autônoma e esta tente consultar o novo registro, a exceção no_data_found será lançada. Pois o novo registro está disponível apenas para primeira transação até que seja aplicado o commit na mesma.
O PRAGMA AUTONOMOUS TRANSACTION cria uma nova sessao para a rotina. Ou seja, você pode comitar ali dentro sem afetar a primeira sessao."

"A Transação autônoma pode resolver problemas reais, contudo se usada de forma indiscriminada pode causar problemas."

"Toda transação dentro do contexto de Sistema Gerenciador de Banco de Dados (SGBD) trabalha com o conceito de Atomicidade, ou seja, a transação é indivisível. Isso significa que, ou ela ocorre inteira ou não ocorre. A linguagem de programação PL/SQL da Oracle possui uma extensão não muito conhecida, Transação Autônoma, mas bem interessante e que pode ser muito útil para resolver alguns casos"

"As operações autônomas pode ser perigoso:

Considere a situação onde você tem a sua operação principal. Tem inseridos / atualizados / deletados. Se você, então, dentro disso, criar uma transação autônoma em seguida,

(1) Não vai consultar todos os dados em tudo. Esta é a situação "seguro". Pode ser útil para registrar informações de forma independente da operação principal de modo que podem ser cometidos sem afetar a operação primária (que pode ser útil para registrar informações de erro quando você espera que a transação primária a ser revertida).

(2) É só consultar os dados que não foi atualizado pela transação primária. Isto é seguro, mas supérflua. Não há nenhum ponto para a operação autônoma.

(3). Ele irá consultar os dados que foram atualizados pela transação primária. Isso cheira a um mal pensado através do design, desde que você tenha algo sobrescrito e depois precisamos voltar para ver o que era antes de você sobrescreveu-lo. Às vezes as pessoas pensam que uma operação autônoma ainda verá as alterações não confirmadas da operação principal, e não vai. Ele lê o estado atualmente comprometida do banco de dados, além de todas as alterações feitas na transação autônoma. Algumas pessoas, muitas vezes tentando transações autônomas em resposta a mutação erros de gatilho) não se importa em que estado os dados estão em quando tentam lê-lo e essas pessoas simplesmente não deveria ser permitido o acesso a um banco de dados.

(4). Ele vai tentar atualizar / excluir os dados que não foi atualizado pela transação primária. Novamente, isso cheira a má concepção. Essas mudanças vão se comprometido (ou revertida) ou não a transação principal êxito ou falha. Problema pior risco que você (5), uma vez que é difícil de determinar, dentro de uma transação autônoma, se os dados foram atualizados pela transação primária.

(5). Você tenta atualizar / excluir os dados que já foram atualizados pela transação primária, caso em que será impasse e acabar em uma bagunça feia.
Uma transação autónoma é uma transação independente, que é iniciada por outra transação (a transação pai). Uma transação autónoma pode modificar dados e cometer ou reversão independente do estado da transação pai.
A transação autônoma deve confirmar ou reverter a transação antes de autônomo é encerrado ea transação pai continua."

Espero ter ajudado, qualquer coisa posta aew!

Abç.,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 15 visitantes