Oracle pl/sql: Commit in Cursor-For-Schleife

zuckerbrini

Mitglied
Hallo!
Ich habe eine Cursor For Schleife, die mir sehr viele Datensätze (ca 60000) zurückgibt.
Um einen Abbruch wegen einem zugroßen Rollbacksegement zu verhinden, möchte ich alle 1000 Datensätze ein Commit oder Rollback (je nach Auswahl) machen.

Da ich das Commit ganz einfach in der For Schleife mache mit einer Überprüfung:
Code:
 	 IF(v_zahl >= 1000) THEN
	     COMMIT;
                           v_zahl := 0;
                       END IF;
bekomm ich ja nun logischer Weise die Fehlermeldung "fetch out of sequence".

Mir fehlt jetzt nur grad eine Idee wie ich das realisieren könnte.

Kann mir irgendwer einen Denkanstoß geben?
 
Zunächst einmal: 60000 ist nicht viel sofern deine Zeilen keine LOBs enthalten oder gerade 200 VARCHAR(4000) Spalten haben. Und die Rollbacksegmente sollte sowas auch nicht stressen, ansonsten sind sie wohl eher zu klein dimensioniert. BTW, wenn du von Rollbacksegmenten sprichst, nutzt ihr noch 8i?

Eine Methode das zu umgehen, wäre den kompletten Cursor erst zu fetchen und zu schliessen und dann erst durch die Datensätze loopen und zwischendurch committen.

Anstatt also einem OPEN Cursor und FETCH LOOP einen BULK COLLECT machen, das ist obendrein wesentlich schneller.
SQL:
declare 
	TYPE mytable IS TABLE OF <cursor name>%ROWTYPE;
	resultset mytable;
begin
	OPEN cursor_name;
	FETCH cursor_name BULK COLLECT INTO resultset;
	CLOSE cursor_name;
	
	FOR i IN resultset.FIRST .. resultset.LAST LOOP
	
		...
	
		IF MOD( i, 1000 ) = 0 THEN
			COMMIT;
		END IF;
	
	END LOOP;
end;
/

Generell sollte ein COMMIT aber niemals aus Rücksicht auf Rollbacksegmente oder sonstigen Parametern gemacht werden sondern sinnvollerweise nach der Anforderung des Businessfalls... immer an den Deasasterfall denken, was passiert wen dnach 36000 Datensätze meine DB wegfliegt? Die hälfte ist geändert und commited, die andere Hälfte nicht...?!
 
Zuletzt bearbeitet von einem Moderator:
Ja in diesem Fall 8i
Bekomm das leider noch immer nicht wirklich hin. Hab alles genauso wie du gemacht. Leider bekomme ich aber immer bei der Zeile
FETCH cursor_name BULK COLLECT INTO resultset;
Diese Meldung
PLS-00597: expression resultset in the INTO list is of wrong type

Was hab ich da falsch gemacht?
 
Ja in diesem Fall 8i
Bekomm das leider noch immer nicht wirklich hin. Hab alles genauso wie du gemacht. Leider bekomme ich aber immer bei der Zeile
FETCH cursor_name BULK COLLECT INTO resultset;
Diese Meldung
PLS-00597: expression resultset in the INTO list is of wrong type

Was hab ich da falsch gemacht?

Hallo,

Wenn ich mich noch richtig erinnere (8i ist schon soooo lange her), unterstützt die 8er keine bulk collects in array of records.
 
Zurück