Nella risposta alla tua domanda precedente, ho menzionato che compilare la raccolta sarebbe stato più difficile con il %rowtype
campo. Per quanto ne so, a meno che tu non dichiari un tipo di oggetto a livello SQL invece di un tipo di record, non puoi utilizzare bulk collect
per questo (anche se vale la pena controllare se è cambiato forse in 12c).
Credo che tu sia bloccato con un ciclo del cursore più semplice che costruisce i due campi nel tuo tipo (cioè il %rowtype
sottocampo e il rowid
campo) separatamente, quindi costruisce la raccolta una riga alla volta:
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;
/
Come discusso anche in precedenza, i riferimenti ai campi del record del sottocampo devono essere qualificati correttamente, quindi ho inserito .data_rec
nei riferimenti in entrambe le procedure. Ho modificato la trasformazione fittizia per modificare il valore anziché l'ID, poiché ciò significa che non sarebbero mai stati effettuati aggiornamenti.
Demo con alcuni dati fittizi:
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