A confirmação é necessária após a operação DML na Função / Procedimento?

20

Gostaria de saber se é necessário escrever commit após inserir / excluir / atualizar na função / procedimento?

Exemplo:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

ou procedimento

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

ele precisa confirmar após excluir?

Não consigo entender a seguinte situação:

  1. Se eu chamar a função / procedimento da janela SQL, será necessário confirmar

    mas

  2. Se eu agendar função / procedimento usando dbms_scheduler e executar o trabalho, a instrução delete será automaticamente confirmada.

    PORQUE?

kupa
fonte

Respostas:

24

Em geral, os procedimentos não devem ser confirmados. Esses tipos de decisões de controle de transação devem ser deixados no código de nível superior que sabe quando uma transação lógica está realmente concluída. Se você confirmar dentro de um procedimento armazenado, estará limitando sua reutilização, porque um chamador que deseja que as alterações que o procedimento faz parte de uma transação maior não pode simplesmente chamar o procedimento diretamente.

Se você chamar um procedimento interativamente, terá que confirmar ou reverter explicitamente a transação, porque o Oracle não tem idéia se você pretende que a chamada de procedimento seja uma transação lógica ou se deseja compor uma transação maior envolvendo várias chamadas de procedimento. Se você usar dbms_scheduler, dbms_schedulerassume que um trabalho é uma transação lógica e é confirmado no final do trabalho, assumindo que foi bem-sucedido ( dbms_jobfaz a mesma coisa).

As funções não devem manipular dados em primeiro lugar. Uma função que manipula dados não pode ser chamada a partir de uma instrução SQL (exceto no caso de canto em que a própria função é declarada para usar uma transação autônoma que quase nunca é apropriada). O objetivo de ter funções e procedimentos é que as funções podem ser incorporadas nas instruções SQL e podem ser concedidas mais livremente aos usuários, porque eles não alteram nenhum dado.

Justin Cave
fonte
11
Não é possível no Oracle que o chamador inicie uma transação que vincule chamadas de procedimento? No SQL Server, você pode confirmar dentro do procedimento, mas se o chamador abriu uma transação antes de chamá-lo, nada será confirmado até que o chamador também seja confirmado.
Nick Chammas
4
@NickChammas - Oracle não tem o conceito de transação aninhada, não. Se o procedimento for confirmado, tudo o que o chamador fez até esse momento será confirmado. O chamador sempre inicia uma transação implicitamente com sua primeira instrução (seja uma chamada de procedimento ou outra coisa), portanto, sempre deve ser da responsabilidade do chamador encerrar a transação.
Justin Cave
@JustinCave Embora isso seja verdade, não se esqueça de transações autônomas.
Philᵀᴹ
@ Phil - É verdade, mas esse é um animal muito diferente. Uma transação autônoma não pode ver as alterações não confirmadas feitas pelo chamador e não pode ser revertida pelo chamador, portanto, é extremamente improvável que algo além de um procedimento de registro deva ser declarado para usar uma transação autônoma.
Justin Cave
4

Para responder sua pergunta; PORQUE?

Você provavelmente já sabe disso agora, já que o post tem 2 anos. Mas vou responder apenas para o registro.

O motivo # 1 requer uma confirmação e o nº 2 não é porque a configuração padrão do banco de dados no Oracle é confirmar uma transação quando uma sessão termina. Se você estiver no sqlplus e executar seu código manualmente, ele não confirmará a transação imediatamente. Se você emitir uma confirmação explícita OU você fizer logoff do sqlpus, a transação será confirmada.

O motivo pelo qual você obtém uma confirmação automática no 2 é porque ele cria uma sessão para executar seu script. Quando concluído, ele efetua logoff automaticamente, o que causará uma confirmação automática.

Steve Cunningham
fonte