2010-11-29 50 views
1

如何对嵌套表进行线性化,嵌套表本身也包含嵌套表(注意:内部表可以具有不同的大小)。假设我有以下类型声明:线性化Oracle嵌套表

CREATE OR REPLACE TYPE VECTOR 
IS 
    TABLE OF NUMBER; 

CREATE OR REPLACE TYPE TABLE_OF_VECTOR 
IS 
    TABLE OF VECTOR; 

和PL/SQL的下面的代码片段:

DECLARE 
    number_table TABLE_OF_VECTOR; 
    result_vector VECTOR; 
BEGIN 
    number_table := table_of_vector(vector(23, 4, 2222, 22222222), 
    vector(2, 1, 766, 2), vector(2, 1, 5)); 
END; 

有没有一种方法,我可以线性number_table及其所有的值存储在result_vector作为一个连续的数字列表?我想结束了:

result_vector == vector(23, 4, 2222, 22222222, 2, 1, 766, 2, 2, 1, 5) 

回答

5

确实如此,但它是不漂亮。

select cast(collect(b.column_value) as vector) 
from table(table_of_vector(
      vector(23, 4, 2222, 22222222), 
      vector(2, 1, 766, 2), 
      vector(2, 1, 5))) a, 
     table(a.column_value) b; 

所以表(...)的一部分对待table_of_vector与名为“COLUMN_VALUE”列中的“常规”表。然后,我们将其视为另一个表,我称之为B.

SELECTed表达式将构成'A'表中'B'表的所有单个数字汇总到一个集合中(使用COLLECT) 。最后,我明确地将该集合转换为VECTOR类型。

+0

非常感谢,只是我一直在寻找的一行。 – wcmatthysen 2010-11-29 03:22:08

1
DECLARE 
    number_table TABLE_OF_VECTOR; 
    result_vector VECTOR:=vector(); 
BEGIN 
    number_table := table_of_vector(vector(23, 4, 2222, 22222222), 
    vector(2, 1, 766, 2), vector(2, 1, 5)); 
for i in number_table.first .. number_table.last loop 
    for j in number_table(i).first .. number_table(i).last loop 
    result_vector.extend(); 
    result_vector(result_vector.count):=number_table(i)(j); 
    end loop; 
end loop; 
for i in 1.. result_vector.count loop 
    dbms_output.put_line(result_vector(i)); 
end loop; 
END; 
/
+0

谢谢,只是想知道:有没有办法做到这一点在单一的选择?像:select into result_vector ...如果Oracle有一些内部机制来做到这一点,那么理想的选择就是我。它几乎感觉像一个未收集(和重新包装)给我。不知道Oracle是否支持这一点。 – wcmatthysen 2010-11-29 02:54:20