Im Allgemeinen sollten Verfahren nicht festgeschrieben werden. Diese Art von Transaktionssteuerungsentscheidungen sollten einem Code höherer Ebene überlassen werden, der weiß, wann eine logische Transaktion tatsächlich abgeschlossen ist. Wenn Sie ein Commit innerhalb einer gespeicherten Prozedur durchführen, schränken Sie deren Wiederverwendbarkeit ein, da ein Aufrufer, der die von der Prozedur vorgenommenen Änderungen als Teil einer größeren Transaktion verwenden möchte, 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 nicht weiß, ob der Prozeduraufruf eine logische Transaktion sein soll oder ob Sie eine größere Transaktion mit mehreren Prozeduraufrufen erstellen möchten. Wenn Sie verwenden dbms_scheduler
, wird dbms_scheduler
davon ausgegangen , dass ein Job eine logische Transaktion ist, und er wird am Ende des Jobs festgeschrieben, sofern er erfolgreich war ( dbms_job
macht dasselbe).
Funktionen sollten Daten nicht in erster Linie manipulieren. Eine Funktion, die Daten manipuliert, kann nicht aus einer SQL-Anweisung aufgerufen werden (mit Ausnahme des Eckfalls, in dem die Funktion selbst für die Verwendung einer autonomen Transaktion deklariert ist, die so gut wie nie geeignet ist). Der springende Punkt bei der Verwendung von Funktionen und Prozeduren ist, dass Funktionen in SQL-Anweisungen eingebettet und Benutzern freier gewährt werden können, da sie keine Daten ändern.
Zur Beantwortung Ihrer Frage; WARUM?
Das wissen Sie wahrscheinlich schon, da die Post 2 Jahre alt ist. Aber ich werde nur für die Aufzeichnung antworten.
Der Grund, warum # 1 ein Commit erfordert und # 2 nicht, ist, dass die Standard-Datenbankeinstellung in Oracle das Commit einer Transaktion ist, 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 ODER sich von sqlpus abmelden, wird die Transaktion festgeschrieben.
Der Grund, warum Sie ein automatisches Commit für # 2 erhalten, besteht darin, dass eine Sitzung zum Ausführen Ihres Skripts erstellt wird. Wenn es abgeschlossen ist, wird es automatisch abgemeldet, was zu einem automatischen Festschreiben führt.
quelle