it-swarm.com.de

Ist nach der DML-Operation in Funktion / Prozedur ein Commit erforderlich?

Ich frage mich, ob es notwendig ist, ein Commit nach dem Einfügen/Löschen/Aktualisieren in Funktion/Prozedur zu schreiben.

Beispiel:

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

oder Verfahren

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

muss es nach dem Löschen festgeschrieben werden?

Kann die folgende Situation nicht verstehen:

  1. Wenn ich die Funktion/Prozedur aus dem SQL-Fenster aufrufe, ist ein Commit erforderlich

    aber

  2. Wenn ich die Funktion/Prozedur mit dbms_scheduler plane und den Job ausführe, wird die Anweisung delete automatisch festgeschrieben.

    WARUM?

20
kupa

Im Allgemeinen sollten Verfahren nicht festgelegt werden. Diese Art von Transaktionssteuerungsentscheidungen sollte einem übergeordneten Code überlassen werden, der weiß, wann eine logische Transaktion tatsächlich abgeschlossen ist. Wenn Sie innerhalb einer gespeicherten Prozedur festschreiben, beschränken Sie deren Wiederverwendbarkeit, da ein Aufrufer, der möchte, dass die Änderungen, die die Prozedur vornimmt, Teil einer größeren Transaktion sind, die Prozedur nicht einfach direkt aufrufen kann.

Wenn Sie eine Prozedur interaktiv aufrufen, müssen Sie die Transaktion explizit festschreiben oder zurücksetzen, da Oracle keine Ahnung hat, ob der Prozeduraufruf eine logische Transaktion sein soll oder ob Sie beabsichtigen, eine größere Transaktion mit mehreren Prozeduraufrufen zu erstellen. Wenn du benutzt dbms_scheduler, dbms_scheduler nimmt an, dass ein Job eine logische Transaktion ist, und schreibt am Ende des Jobs fest, dass er erfolgreich war (dbms_job macht das gleiche).

Funktionen sollten Daten überhaupt nicht manipulieren. Eine Funktion, die Daten manipuliert, kann nicht über eine SQL-Anweisung aufgerufen werden (mit Ausnahme des Eckfalls, in dem die Funktion selbst für die Verwendung einer autonomen Transaktion deklariert ist, die fast nie geeignet ist). Der springende Punkt bei Funktionen und Prozeduren ist, dass Funktionen in SQL-Anweisungen eingebettet und Benutzern freier gewährt werden können, da sie keine Daten ändern.

24
Justin Cave

Zur Beantwortung Ihrer Frage; WARUM?

Das wissen Sie wahrscheinlich schon, da der Beitrag 2 Jahre alt ist. Aber ich werde nur für die Aufzeichnung antworten.

Der Grund Nr. 1 erfordert ein Festschreiben und Nr. 2 nicht, weil die Standarddatenbankeinstellung in Oracle darin besteht, eine Transaktion festzuschreiben, wenn eine Sitzung endet. Wenn Sie sich in sqlplus befinden und Ihren Code manuell ausführen, wird die Transaktion nicht sofort festgeschrieben. Wenn Sie ein explizites Commit ausführen OR, wenn Sie sich von sqlpus abmelden, wird die Transaktion festgeschrieben.

Der Grund, warum Sie ein automatisches Commit für # 2 erhalten, liegt darin, dass eine Sitzung zum Ausführen Ihres Skripts erstellt wird. Wenn der Vorgang abgeschlossen ist, wird er automatisch abgemeldet, was zu einem automatischen Festschreiben führt.

4