Ini adalah cara yang sangat tidak efisien untuk melakukannya. Anda dapat menggunakan merge
pernyataan dan kemudian tidak perlu kursor, perulangan atau (jika Anda dapat melakukannya tanpa) 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)
Pastikan Anda commit
, setelah selesai, agar dapat melihat ini di database.
Untuk benar-benar menjawab pertanyaan Anda, saya akan melakukannya seperti berikut. Ini memiliki keuntungan melakukan sebagian besar pekerjaan di SQL dan hanya memperbarui berdasarkan rowid, alamat unik dalam tabel.
Ini mendeklarasikan tipe, di mana Anda menempatkan data dalam jumlah besar, 10.000 baris sekaligus. Kemudian proses baris ini satu per satu.
Namun, seperti yang saya katakan ini tidak akan seefisien 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;
/