Collections pl/sql中的嵌套表元素赋值
我在pl/sql嵌套表中的要求如下: 我声明了一个嵌套表集合类型,并根据表中的查找填充元素。 如果查找为代码生成多行多个值,则在嵌套表中添加所有这些多个值并继续。这就是我被困的地方。 我无法增加异常中的父计数器indx来处理这些多行。因为我不是,所以它只存储嵌套表中的最新数据,而不是所有数据Collections pl/sql中的嵌套表元素赋值,collections,plsql,oracle11g,Collections,Plsql,Oracle11g,我在pl/sql嵌套表中的要求如下: 我声明了一个嵌套表集合类型,并根据表中的查找填充元素。 如果查找为代码生成多行多个值,则在嵌套表中添加所有这些多个值并继续。这就是我被困的地方。 我无法增加异常中的父计数器indx来处理这些多行。因为我不是,所以它只存储嵌套表中的最新数据,而不是所有数据 declare TYPE final_coll_typ IS TABLE OF varchar2(100); l_final_coll final_coll_typ; MULTI_FETCH EXCEP
declare
TYPE final_coll_typ IS TABLE OF varchar2(100);
l_final_coll final_coll_typ;
MULTI_FETCH EXCEPTION;
PRAGMA EXCEPTION_INIT(MULTI_FETCH, -1422); -- this is an ora error for exact fetch returns more than the required number of rows
begin
for indx in 1..<count> loop
<some processing logic here>
select code into l_final_coll(indx) from lookup_tbl where <some filter>;
exception
when MULTI_FETCH then
for p in (select code from lookup_tbl where <some filter>)
loop
l_final_coll(indx) := p.code;
dbms_output.put_line(l_final_coll(indx));
end loop;
continue; -- this is for further processing after the loop
end loop;
end;
比方说,计数器indx的第一次迭代只为代码生成了一行数据。存储在l_final_collindx中。
假设indx i的下一次迭代主for循环为代码生成2行值。我的想法是捕获异常ORA-01422,并在现有嵌套表中不断添加这两个代码值
因此,实际上,我的嵌套表的元素中现在应该有3个代码值。但是,目前,我只能让它填充其中的两个:第一次迭代的单个值和下一次迭代的最新值
任何关于我如何能做到这一点的建议都将不胜感激
PS:尝试操作计数器变量indx和p。但是,pl/sql显然不允许它用于for循环。您根本不需要执行单个选择,只需使用游标循环开始,并附加到必须初始化的集合:
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;
/
。。。然后使用特定计数器和过滤器:
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;
/
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
作为一个稍微复杂一点的选项,您可以将所有匹配的数据批量收集到一个临时集合中,然后在该集合上循环以将这些值附加到实际集合中。比如:
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;
/
。。。我再次得到:
anonymous block completed
Final size: 4
谢谢你给我这么多选择。你给的第一个选择很好…不知道为什么我没有想到它…呸!
anonymous block completed
Final size: 4