你并不需要做一个选择,只是一些使用游标循环入手,并追加到集合(你不得不初始化):
declare
type final_coll_typ is table of varchar2(100);
l_final_coll final_coll_typ;
begin
l_final_coll := final_coll_typ();
for indx in 1..<count> loop
<some processing logic here>
for p in (select code from lookup_tbl where <some filter>) loop
l_final_coll.extend(1);
l_final_coll(l_final_coll.count) := p.code;
end loop;
end loop;
dbms_output.put_line('Final size: ' || l_final_coll.count);
end;
/
对于每个发现行但是游标,集合被扩展1(这不是非常有效),并且游标值被放入最后的空行中;这是从目前的count
找到的。
作为演示,如果我创建一个虚拟表有重复的值:
create table lookup_tbl(code varchar2(100));
insert into lookup_tbl values ('Code 1');
insert into lookup_tbl values ('Code 2');
insert into lookup_tbl values ('Code 2');
insert into lookup_tbl values ('Code 3');
...然后用特定的计数器和过滤:
declare
type final_coll_typ is table of varchar2(100);
l_final_coll final_coll_typ;
begin
l_final_coll := final_coll_typ();
for indx in 1..3 loop
for p in (select code from lookup_tbl where code = 'Code ' || indx) loop
l_final_coll.extend(1);
l_final_coll(l_final_coll.count) := p.code;
end loop;
end loop;
dbms_output.put_line('Final size: ' || l_final_coll.count);
end;
/
...我得到:
anonymous block completed
Final size: 4
作为一个稍微COM可以将所有匹配的数据批量收集到一个临时集合中,然后循环以将这些值附加到实际集合中。例如:
declare
type final_coll_typ is table of varchar2(100);
l_final_coll final_coll_typ;
l_tmp_coll sys.dbms_debug_vc2coll;
begin
l_final_coll := final_coll_typ();
for indx in 1..<count> loop
<some processing logic here>
select code bulk collect into l_tmp_coll from lookup_tbl where <some filter>;
for cntr in 1..l_tmp_coll.count loop
l_final_coll.extend(1);
l_final_coll(l_final_coll.count) := l_tmp_coll(cntr);
end loop;
end loop;
end;
/
可能有更快的方法来组合两个集合,但我不知道其中之一。批量收集必须放入模式级收集类型,因此您不能使用本地final_coll_typ
。您可以创建自己的模式级别类型,然后将其用于临时和最终收集变量;但我用了一个内置的sys.dbms_debug_vc2coll
,它被定义为table of varchar2(1000)
。
作为演示,以上述相同的表/数据,以及相同的具体数量和过滤器:
declare
type final_coll_typ is table of varchar2(100);
l_final_coll final_coll_typ;
l_tmp_coll sys.dbms_debug_vc2coll;
begin
l_final_coll := final_coll_typ();
for indx in 1..3 loop
select code bulk collect into l_tmp_coll
from lookup_tbl where code = 'Code ' || indx;
for cntr in 1..l_tmp_coll.count loop
l_final_coll.extend(1);
l_final_coll(l_final_coll.count) := l_tmp_coll(cntr);
end loop;
end loop;
dbms_output.put_line('Final size: ' || l_final_coll.count);
end;
/
...我再次得到:
anonymous block completed
Final size: 4
感谢许多选项。你给的第一个选项是整洁的...不知道为什么我没有想到它......呃! – Casey 2014-09-04 15:29:12