Ihr Code funktioniert nicht wie Sie erwarten, weil a) Sie die Exit-Klausel aus Ihrer äußeren Schleife fehlt, b) bis Sie mindestens Zeile abgerufen haben, wird der% ROWCOUNT 0 zurückgeben (und auch wenn es abgerufen wurde eine Zeile, wenn Sie erwarten, dass die Anzahl der Zeilen im Cursor zurückkehrt, dann irren Sie sich leider - wir wissen nur die Anzahl der Zeilen, die vom Cursor zurückgegeben werden, sobald wir alle Zeilen aus der Zeile abgerufen haben cursor), c) mit l_eff_start_date = '31-dec-4712'
versucht man eine Variable als Teil einer update-Anweisung zu setzen - das macht keinen Sinn! - und d) Sie haben die Variablen l_person_id, l_eff_start_date, l_eff_end_date oder num_count nicht deklariert.
Sie haben einige Optionen - zunächst einmal, hier ist das, was Ihr Code aussehen sollte - Sie gar nicht brauchen, dass äußere Schleife:
create or replace package body package_name
as
procedure update_dte
is
cursor cur_variable is
select person_id, eff_start_date, eff_end_date
from tab_abc;
begin
open cursor cur_variable;
loop
fetch cursor cur_variable
into l_person_id, l_eff_start_date, l_eff_end_date;
exit when cur_variable%notfound;
update tab_abc
set start_date = to_date('31-12-4712', 'dd-mm-yyyy') -- assuming start_date is of DATE datatype;
where person_id=l_person_id;
end loop;
close cur_variable;
end update_dte;
end package_name;
/
Allerdings gibt es einen einfacheren Weg, durch einen Cursor von looping , wo Sie müssen Werte in, Öffnen oder Schließen des Cursors oder das Abrufen der Datensätze keine Sorgen über eine Variable zu schaffen zurückzukehren - den Cursor-for-Schleife das alles für Sie handhaben:
create or replace package body package_name
as
procedure update_dte
is
cursor cur_variable is
select person_id, eff_start_date, eff_end_date
from tab_abc;
begin
for rec in cur_variable;
loop
update tab_abc
set start_date = to_date('31-12-4712', 'dd-mm-yyyy') -- assuming start_date is of DATE datatype;
where person_id=l_person_id;
end loop;
end update_dte;
end package_name;
/
jedoch Viel besser und leistungsfähiger ist es, eine einzige update-Anweisung zu verwenden, um das w zu machen Ork auf einen Schlag, anstatt Zeile für Zeile. In Ihrem Fall, Sie brauchen nicht einmal haben Sie den Cursor auf eine Schleife durch, da Sie alle Zeilen in tab_abc aktualisieren, so dass Ihr Update wird einfach:
create or replace package body package_name
as
procedure update_dte
is
begin
update tab_abc
set start_date = to_date('31-12-4712', 'dd-mm-yyyy'); -- assuming start_date is of DATE datatype;
end update_dte;
end package_name;
/
In allen drei Fällen habe ich angenommen, dass Sie haben versucht, die Spalte start_date zu aktualisieren (und sie ist vom Datentyp DATE). Wenn dies nicht der Fall ist, müssen Sie Ihre Frage aktualisieren, um weitere Details zu dem zu erhalten, was Sie mit diesem Verfahren versuchen möchten. Ist es eine Hausaufgabenfrage?
Warum verwenden Sie an erster Stelle einen Cursor und eine for-Schleife? Scheint unnötig –