Il commit è necessario dopo l'operazione DML in Funzione / Procedura?


20

Mi chiedo se è necessario scrivere il commit dopo aver inserito / eliminato / aggiornato in funzione / procedura?

Esempio:

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

o procedura

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

è necessario eseguire il commit dopo l'eliminazione?

Non riesco a capire la seguente situazione:

  1. Se chiamo la funzione / procedura dalla finestra SQL, allora richiede il commit

    ma

  2. Se pianifico la funzione / procedura utilizzando dbms_scheduler ed eseguo il lavoro, l'istruzione delete viene automaticamente impegnata.

    PERCHÉ?

Risposte:


24

In generale, le procedure non dovrebbero impegnarsi. Quei tipi di decisioni sul controllo delle transazioni dovrebbero essere lasciati a un codice di livello superiore che sappia quando una transazione logica è effettivamente completa. Se si esegue il commit all'interno di una procedura memorizzata, si sta limitando la sua riusabilità perché un chiamante che desidera che le modifiche apportate alla procedura faccia parte di una transazione più ampia non può semplicemente chiamare direttamente la procedura.

Se si chiama una procedura in modo interattivo, sarà necessario eseguire il commit o il rollback esplicito della transazione perché Oracle non ha idea se si intende che la chiamata di procedura sia una transazione logica o se si intende comporre una transazione più ampia che coinvolge più chiamate di procedura. Se si utilizza dbms_scheduler, si dbms_schedulerpresuppone che un lavoro sia una transazione logica e si impegna alla fine del lavoro assumendo che abbia esito positivo ( dbms_jobfa la stessa cosa).

Le funzioni non dovrebbero manipolare i dati in primo luogo. Una funzione che manipola i dati non può essere chiamata da un'istruzione SQL (salvo il caso angolare in cui viene dichiarata la funzione stessa utilizzare una transazione autonoma che non è quasi mai appropriata). Il punto centrale di avere sia funzioni che procedure è che le funzioni possono essere incorporate nelle istruzioni SQL e possono essere concesse più liberamente agli utenti perché non modificano alcun dato.


1
In Oracle non è possibile che il chiamante inizi una transazione che vincola le chiamate di procedura? In SQL Server è possibile eseguire il commit all'interno della procedura, ma se il chiamante ha aperto una transazione prima di chiamare quella procedura, nulla viene eseguito fino a quando non viene eseguito il commit del chiamante.
Nick Chammas,

4
@NickChammas - Oracle non ha il concetto di transazione nidificata, no. Se la procedura si impegna, tutto ciò che il chiamante ha fatto fino a quel momento si impegnerebbe. Il chiamante avvia sempre una transazione in modo implicito con la sua prima istruzione (che si tratti di una chiamata di procedura o qualcos'altro), quindi dovrebbe sempre spettare al chiamante terminare la transazione.
Grotta di Giustino

@JustinCave Anche se è vero, non dimenticare le transazioni autonome.
Philᵀᴹ

@Phil - Vero, ma è un animale molto diverso. Una transazione autonoma non è in grado di vedere le modifiche senza commit apportate dal chiamante e non può essere ripristinata dal chiamante, quindi è estremamente improbabile che qualsiasi altra cosa diversa da una procedura di registrazione debba essere dichiarata per utilizzare una transazione autonoma.
Grotta di Giustino

4

Per rispondere alla tua domanda; PERCHÉ?

Probabilmente lo sai già da quando il post ha 2 anni. Ma risponderò solo per la cronaca.

Il motivo n. 1 richiede un commit e il n. 2 no perché l'impostazione predefinita del database in Oracle prevede il commit di una transazione al termine di una sessione. Se sei in sqlplus ed esegui il tuo codice manualmente, non eseguirà immediatamente il commit della transazione. Se si emette un commit esplicito O ci si disconnette da sqlpus, la transazione verrà eseguita.

Il motivo per cui ricevi un commit automatico su # 2 è perché crea una sessione per eseguire il tuo script. Al termine, si disconnette automaticamente, causando un commit automatico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.