Gostaria de saber se é necessário escrever commit após insert/delete/update em function/procedure?
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;
precisa de commit após a exclusão?
Não consigo entender a seguinte situação:
Se eu chamar a função/procedimento da janela SQL, ela requer confirmação
mas
Se eu agendar uma função/procedimento usando dbms_scheduler e executar o trabalho, a instrução delete será confirmada automaticamente.
PORQUE?
Em geral, os procedimentos não devem comprometer. Esses tipos de decisões de controle de transações devem ser deixadas para o 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 feitas pelo procedimento façam 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 ideia se você pretende que a chamada do procedimento seja uma transação lógica ou se pretende compor uma transação maior envolvendo várias chamadas de procedimento. Se você usar
dbms_scheduler
,dbms_scheduler
assume que um trabalho é uma transação lógica e confirma no final do trabalho assumindo que foi bem-sucedido (dbms_job
faz 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 ponto principal de ter funções e procedimentos é que as funções podem ser incorporadas em instruções SQL e podem ser concedidas mais livremente aos usuários porque não alteram nenhum dado.
Para responder sua pergunta; PORQUE?
Você provavelmente já sabe disso, já que o post tem 2 anos. Mas vou responder só para constar.
A razão #1 requer um commit e #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 um commit explícito OU fizer logoff do sqlpus, a transação será confirmada.
A razão pela qual você obtém um commit automático no #2 é porque ele cria uma sessão para executar seu script. Quando ele for concluído, ele será desconectado automaticamente, o que causará um commit automático.