Frage zu Cursor und PL/SQL allgemein

Hallo,

wenn ich eine Schleife mit einem Cursor aufrufe (for rec in cursor loop), wie genau läuft das dann ab ?
führt der erst das Cursorstatement aus, schiebt das Ergebnis in eine Virtuelle Tabelle und läuft dann mittels Pointer von oben nach unten durch oder wird die Abfrage bei jedem Schleifendurchlauf erneut aufgerufen und die DB „merkt“ sich nur was sie schon hatte ?

2te Frage, wenn ich ein PL/SQL Statement losschicke das so endet:
End loop;
commit;
end;
/
und die Session bricht ab, dann läuft das Script doch weiter, commited und fertig, oder ?

Hintergrund, hier läuft seit Tagen ein Script mit einem Cursor der 320000 Zeilen abläuft. Toad sagt mir zwar das es Block-Changes gibt, aber ich bin schon ziemlich skeptisch das das Script das richtige tut.

Grüße

Chris

Hallo,

ein CURSOR ist ein Zeiger auf eine Ergebnismenge. Diese wird durch inkrementieren des Cursors schrittweise abgearbeitet. Dabei muss diese aber nicht vollständig im Speicher sein (Datenbanken arbeiten mit Iteratoren).

Da Prozeduren in der Session dessen laufen, der sie aufgerufen hat, sollten sie NICHT weiterlaufen.

Du kannst ja mal mit der Enterprise Manager Konsole nachschauen, was die Prozedur so macht und wem sie gehört.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Es wäre günstiger gewesen, sofern erlaubt, öfter zu commiten. Jetzt baust Du rieeesige Redo-Logs.
Ich habe bei solchen Mega-Loops gern eine Hilfstabelle, in die ich alle x-Prozent den Fortschritt eintrage.
Aber das hilft Dir jetzt auch nicht, Du musst halt rödeln lassen…

zu 2.
wenn das script wegen eines Fehlers vor dem Commit abbricht, werden die redo-Logs abgearbeitet um den Stand vor Start der Session wiederherzustellen. Das passiert automatisch und sofern nix schief geht ist alles wieder i.O.

Wenn Du aber eine RiesenSession laufen hast, kann es auch passieren, das die Tabelspaces für die redo-Logs nicht ausreichen und beim Auto-Extend irgendwas in die Hose geht.

Hi,

es wurde mittlerweile beschlossen das Script abzubrechen, die sollen sich was anderes überlegen…

Grüße

Chris