Dans la réponse à votre question précédente, j'ai mentionné que remplir la collection serait plus difficile avec le %rowtype
champ. Autant que je sache, à moins que vous ne déclariez un type d'objet de niveau SQL au lieu d'un type d'enregistrement, vous ne pouvez pas utiliser bulk collect
pour cela (bien que cela vaut la peine de vérifier si cela a peut-être changé dans 12c).
Je crois que vous êtes coincé avec une boucle de curseur plus simple qui construit les deux champs de votre type (c'est-à-dire le %rowtype
sous-champ et le rowid
champ) séparément, puis construit la collection une ligne à la fois :
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;
/
Comme également discuté précédemment, les références aux champs de l'enregistrement de sous-champ doivent être qualifiées correctement, j'ai donc inséré .data_rec
dans les références des deux procédures. J'ai changé la transformation factice pour modifier la valeur au lieu de l'ID, car cela signifie qu'aucune mise à jour ne se produira jamais.
Démo avec quelques données factices :
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