Frage

Ich frage mich zu wissen, ob es notwendig ist, Commit nach dem Einfügen/Löschen/Update 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 eingehen?

Kann die folgende Situation nicht verstehen:

  1. Wenn ich die Funktion/das Verfahren aus dem SQL -Fenster aufrufe

    aber

  2. Wenn ich Funktion/Prozedur mithilfe von DBMS_Scheduler plane und den Job ausführe, wird die Löschung automatisch begangen.

    WARUM?

War es hilfreich?

Lösung

Im Allgemeinen sollten sich Verfahren nicht begehen. Diese Art von Transaktionskontrollentscheidungen sollte einem Code auf höherem Niveau überlassen werden, der weiß, wann eine logische Transaktion tatsächlich abgeschlossen ist. Wenn Sie sich innerhalb eines gespeicherten Verfahrens begehen, begrenzen Sie seine Wiederverwendbarkeit, da ein Anrufer, der die Änderungen, die das Verfahren für eine größere Transaktion ist, das Verfahren nicht direkt aufrufen kann.

Wenn Sie eine Prozedur interaktiv anrufen, müssen Sie die Transaktion explizit eingehen oder rollen, da Oracle keine Ahnung hat, ob Sie beabsichtigen, dass der Verfahrensaufruf eine logische Transaktion ist oder ob Sie eine größere Transaktion mit mehreren Verfahrensanrufen zusammenstellen möchten. Wenn du benutzt dbms_scheduler, dbms_scheduler Angenommen, ein Job ist eine logische Transaktion und verpflichtet sich am Ende des Jobs unter der Annahme, dass er erfolgreich war (erfolgreich (dbms_job macht das Gleiche).

Funktionen sollten Daten überhaupt nicht manipulieren. Eine Funktion, die Daten manipuliert, kann nicht aus einer SQL -Anweisung aufgerufen werden (abgesehen von der Ecke, in der die Funktion selbst für eine autonome Transaktion deklariert wird, die fast nie angemessen ist). Der springende Punkt bei sowohl Funktionen als auch Verfahren ist, dass Funktionen in SQL -Anweisungen eingebettet werden können und den Benutzern mehr frei gewährt werden können, da sie keine Daten ändern.

Andere Tipps

Zur Beantwortung Ihrer Frage; WARUM?

Sie wissen das wahrscheinlich schon seit jeher, seit der Beitrag 2 Jahre alt ist. Aber ich werde nur auf die Aufzeichnung antworten.

Der Grund Nr. 1 erfordert ein Commit und #2 ist nicht der Fall, dass die Standarddatenbankeinstellung in Oracle darin besteht, eine Transaktion zu begehen, wenn eine Sitzung endet. Wenn Sie in SQLPLUS sind und Ihren Code manuell ausführen, wird die Transaktion nicht sofort begehen. Wenn Sie ein explizites Commit oder Sie von SQLPUs abgeben, wird die Transaktion begehen.

Der Grund, warum Sie sich automatisch für #2 eingehen, ist, dass sie eine Sitzung erstellt, um Ihr Skript auszuführen. Wenn es abgeschlossen ist, protokolliert es automatisch ab, was zu einem automatischen Commit führt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top