楼上给我发的pm, 因为是讨论技术问题,公开在这里答复:
Naldonado 2014-3-25 23:48
关于你在“Oracle Table类型集合变量的排序问题”的帖子
http://www.itpub.net/thread-1852275-1-1.html
版主您好,这个帖子的8楼,是我按你的思路写的sql。但是我有个疑问,好像object 类型的嵌套表,我就没法select * bulk collect into 。非得我重新定义一个record类型的嵌套表。
菜单
Naldonado 2014-3-25 23:49
这是怎么回事?我刚开始还想用我之前的类型,狂报“没有足够的值”
菜单
Naldonado 2014-3-25 23:49
比如这么写就不行。declare
-- type t_test_rec is record(id number, name varchar2(20));
type t_test_tbl2 is table of t_test_obj;
L_TEST_TBL2 T_TEST_TBL2;
begin
select * bulk collect into l_test_tbl2 from table(return_nest_table()) order by name;
dbms_output.put_line('新的顺序:');
for i in 1..l_test_tbl2.count loop
dbms_output.put_line(l_test_tbl2(i).id||'-'||l_test_tbl2(i).name);
end loop;
END;
答复:
因为l_test_tbl2是基于对象类型的集合,它的每个元素都是一个object而不是一个记录。SELECT * 可以构造记录,但是要构造对象就必须调用其构建函数:
declare
type t_test_tbl2 is table of t_test_obj;
L_TEST_TBL2 T_TEST_TBL2;
begin
select t_test_obj(id,name)
bulk collect
into l_test_tbl2
from table(return_nest_table()) order by name;
dbms_output.put_line('新的顺序:');
for i in 1..l_test_tbl2.count loop
dbms_output.put_line(l_test_tbl2(i).id||'-'||l_test_tbl2(i).name);
end loop;
END;