Това е изключително неефективен начин да го направите. Можете да използвате merge
изявление и тогава няма нужда от курсори, цикъл или (ако можете без) PL/SQL.
MERGE INTO studLoad l
USING ( SELECT studId, studName FROM student ) s
ON (l.studId = s.studId)
WHEN MATCHED THEN
UPDATE SET l.studName = s.studName
WHERE l.studName != s.studName
WHEN NOT MATCHED THEN
INSERT (l.studID, l.studName)
VALUES (s.studId, s.studName)
Уверете се, че сте commit
, след като приключите, за да можете да видите това в базата данни.
За да отговоря всъщност на въпроса ви, бих го направил по следния начин. Това има предимството да върши по-голямата част от работата в SQL и да актуализира само въз основа на rowid, уникален адрес в таблицата.
Той декларира тип, в който поставяте данните групово, 10 000 реда наведнъж. След това обработва тези редове поотделно.
Въпреки това, както казах, това няма да бъде толкова ефективно, колкото merge
.
declare
cursor c_data is
select b.rowid as rid, a.studId, a.studName
from student a
left outer join studLoad b
on a.studId = b.studId
and a.studName <> b.studName
;
type t__data is table of c_data%rowtype index by binary_integer;
t_data t__data;
begin
open c_data;
loop
fetch c_data bulk collect into t_data limit 10000;
exit when t_data.count = 0;
for idx in t_data.first .. t_data.last loop
if t_data(idx).rid is null then
insert into studLoad (studId, studName)
values (t_data(idx).studId, t_data(idx).studName);
else
update studLoad
set studName = t_data(idx).studName
where rowid = t_data(idx).rid
;
end if;
end loop;
end loop;
close c_data;
end;
/