2010-11-29 84 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