2010-11-29 4 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; 

그래서 테이블 (...) 일부는 이름이 "COLUMN_VALUE"과 열이있는 '일반'테이블로 table_of_vector을 처리합니다. 우리는 이것을 내가 B라고 불렀던 또 다른 테이블로 취급합니다.

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

감사합니다. 다음과 같이 알고 싶습니다. 하나의 선택에서이 작업을 수행 할 방법이 없습니까? like : select into result_vector ... 오라클이이를 수행하기위한 내부 메커니즘이 있다면 나에게 이상적입니다. 그것은 거의 나에게 모으기 (그리고 재 포장)하는 것 같은 느낌이 든다. 오라클이이를 지원하는지 잘 모름. – wcmatthysen