2010-11-29 5 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線形化と結果範囲でそのすべての値を格納することができます方法はあります1つの連続した数字のリスト?私はで終わるしたい:

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; 

ので、テーブル(...)の部分は、名前「COLUMN_VALUE」とコラムで「定期的な」テーブルとしてtable_of_vectorを扱います。

SELECT式では、 'A'テーブルの 'B'テーブルを構成するすべての個体番号を集計して(COLLECTを使用して)集計します。 。最後に、コレクションをVECTOR型として明示的にキャストします。

+0

ありがとう、私が探していたワンライナー。 – wcmatthysen

+0

ちょうど副次的な問題です:どの方法がパフォーマンスの観点から最高です(forループソリューションと比較して)?私の訓練されていない目には、これはデカルト結合のように見えます。 – wcmatthysen

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

ありがとう、ちょうど知りたいことは:これを1回の選択で行う方法はありませんか? like:select into result_vector ...私にとって理想的なのは、Oracleがこれを行うための内部メカニズムを持っているかどうかです。それはほとんど私のように収集されていない(と再パック)のように感じる。 Oracleがこれをサポートしているかどうかはわかりません。 – wcmatthysen