Grundsätzlich ist ein Cursor ein Bereich des Speichers, der zum Speichern des Ergebnisses einer bestimmten Abfrage verwendet wird. Eine Frage, die ich habe, ist Cursor implizit durchlaufen alle Datensätze? Angenommen, ich einen Code-Schnipsel wie das schreiben folgendes:Schleifen in Cursoren in Oracle pl/sql
declare
cursor cur_dum is
select name,class,enroll_id from table_student;
begin
fetch cur_dum into the_name, the_class, the_enroll_id;
update table_log set statement = the_name || '-'||'-'||to_char(the_enroll_id)
where roll_id = the_enroll_id;
close cur_dum;
end;
Wird dieser Code-Schnipsel, ohne explizite Anweisung der Schleife, automatisch eine Schleife durch alle Datensätze in table_student und führen Sie die entsprechende Update in table_log Muss ich hinzufügen müssen? eine Schleife nach der Fetch-Anweisung? Welchen Unterschied würde es machen, wenn ich während des Abrufens eine Bulk Collect-Anweisung verwende?
Aus der Antwort, ich habe es, dass explizit eine Schleife erforderlich ist.
ich auf einen Ausschnitt des Codes kam, die eine Schleife für einen Cursor verwendet, und verwendete auch eine für Innere Schleife .Der folgende ist das Codefragment: hat
Cursor CurSquirell IS
select Name,a_val,b_val,col_ID from table_temp;
BEGIN
LoopCounter := 0;
commit;
LOOP
FETCH CurSquirell BULK COLLECT INTO my_name,my_a_val,my_b_val,my_col_id LIMIT 1000;
LoopCounter := LoopCounter + 1;
FOR intIndex IN 1 .. my_col_id.COUNT LOOP
counter := counter +1;
BEGIN
select t.tender_val,t.tender_pay, t.page_no, t.loc
into my_tender_val,my_tender_pay,my_page_no , my_loc
from bussiness_trans bt, tender_details t
where t.account_no = bt.account_no
and bt.external_id=my_col_id(intIndex)
and trim(replace(t.tender_pay,'0',' ')) = trim(replace(a_val(intIndex),'0',' '))
and bt.id_type=1;
BEGIN
select pp.lock_id into my__lock_id
from pay_roll pp
where pp.pay_points= my_tender_pay
and bt.id_type=5;
BEGIN
update tab_cross_exchange tce
set tce.cross_b_val = my_b_val(intIndex)
where tce.lock_id = my_lock_id;
..............................sql statements...
...sql statements...
end;
end;
end;
Wenn in der Codeschleife bereits verwendet Um die Datensätze einzeln durchzugehen, warum wurde die for loop
verwendet? In welchen Situationen würden Sie eine for loop
so in einer Cursorschleife benötigen? Muss die Massensammlung irgendetwas tun, um die Verwendung der For-Schleife zu erzwingen?
Nein, sie holen nicht implizit alle Zeilen. Sie müssten einen Bulk-Fetch oder eine Loop durchführen, wie [dokumentiert] (http://docs.oracle.com/database/121/LNPLS/cursor_for_loop_statement.htm). –
Außerdem speichert ein Cursor das Ergebnis einer Abfrage nicht. Es [speichert Informationen zur Verarbeitung einer Abfrage] (http://docs.oracle.com/database/121/LNPLS/explicit_cursor.htm). Die Ergebnisse werden zurück zum Anrufer gestreamt. –
Das viele verschachtelte BEGIN..END-Blöcke ist ein Code-Geruch. Ich weiß nicht, wo Sie "einen Code-Ausschnitt gefunden haben", aber ich würde das als eine Quelle guter Praxis misstrauen. – APC