Dalam jawaban atas pertanyaan Anda sebelumnya, saya menyebutkan bahwa mengisi koleksi akan lebih sulit dengan %rowtype
bidang. Sejauh yang saya ketahui, kecuali jika Anda mendeklarasikan tipe objek tingkat SQL alih-alih tipe catatan, Anda tidak dapat menggunakan bulk collect
untuk ini (walaupun perlu diperiksa apakah itu telah berubah di 12c mungkin).
Saya yakin Anda terjebak dengan menggunakan loop kursor sederhana yang membangun dua bidang dalam tipe Anda (yaitu %rowtype
sub-bidang dan rowid
field) secara terpisah, lalu membuat koleksi satu baris dalam satu waktu:
create or replace package body dat_pkg is
procedure transform_dat (p_batch_name data_test.batch_name%type)
is
cursor cur_dat is
select rowid, a.*
from data_test a
where batch_name = p_batch_name;
l_dat_tst typ_dat_tst;
l_rec data_test%rowtype;
begin
for rec_dat in cur_dat loop
l_rec.data_id := rec_dat.data_id;
l_rec.data_value := rec_dat.data_value;
l_rec.batch_name := rec_dat.batch_name;
-- or use a counter you increment for this...
l_dat_tst(l_dat_tst.count + 1).data_rec := l_rec;
l_dat_tst(l_dat_tst.count).data_rowid := rec_dat.rowid;
end loop;
-- Do the Transformation here. Example --
for i in 1..l_dat_tst.count loop
if l_dat_tst(i).data_rec.data_value = 'hello' then
l_dat_tst(i).data_rec.data_value := 'was hello';
else
l_dat_tst(i).data_rec.data_value := 'was not hello';
end if;
end loop;
-- update the table
proc_test (p_dat => l_dat_tst);
end transform_dat;
procedure proc_test (p_dat typ_dat_tst)
is
begin
for i in 1..p_dat.count loop
update data_test
set data_value = p_dat(i).data_rec.data_value
where data_id = p_dat(i).data_rec.data_id
and rowid = p_dat(i).data_rowid;
end loop;
end proc_test;
end dat_pkg;
/
Seperti yang juga dibahas sebelumnya, referensi ke kolom sub-bidang-catatan harus memenuhi syarat dengan benar, jadi saya telah memasukkan .data_rec
dalam referensi di kedua prosedur. Saya telah mengubah transformasi dummy untuk mengubah nilai alih-alih ID, karena itu berarti tidak ada pembaruan yang akan terjadi.
Demo dengan beberapa data dummy:
insert into data_test values (1, 'hello', 'test');
insert into data_test values (2, 'hello', 'test');
insert into data_test values (3, 'hello', 'exclude');
insert into data_test values (4, 'goodbye', 'test');
exec dat_pkg.transform_dat('test');
select * from data_test;
DATA_ID DATA_VALUE BATCH_NAME
---------- -------------------- --------------------
1 was hello test
2 was hello test
3 hello exclude
4 was not hello test