2012-05-11 3 views
4

다음 예제에서는 3 개의 항목으로 VARRAY를 만듭니다.테이블로 변환 한 후 VARRAY 항목의 인덱스를 얻는 방법

[email protected]> select t1, t2.* from 
    2 (select 'X' as t1 from dual UNION select 'Y' from dual) t1, 
    3 table (sys.odcivarchar2list('a', 'b', 'c'))    t2; 

T1 COLUMN_VALUE 
--- -------------------- 
X a 
X b 
X c 
Y a 
Y b 
Y c 
나는 다음과 같은 출력이 싶습니다

: sys.odcivarchar2listVARRAY(32767) OF VARCHAR2(4000);으로 미리 정의되어

T1 INDEX COLUMN_VALUE 
--- ----- -------------------- 
X 1  a 
X 2  b 
X 3  c 
Y 1  a 
Y 2  b 
Y 3  c 

하는 것으로합니다.

답변

1
select t1, row_number() over (partition by t1 order by t1), t2.* from 
(select 'X' as t1 from dual UNION select 'Y' from dual) t1, 
table (sys.odcivarchar2list('a', 'b', 'c'))    t2; 
+0

사실, 나는 잘못 읽었다. 배열 내의 실제 인덱스가 필요합니다. 배열 항목이 인덱스 순서로 반환되도록 보장되면 내 솔루션이 작동하는 것 같아요. – Phil

2

필자가 아는 한 작동 보장되는 순수한 SQL 솔루션이 없습니다. 아마도 VARCHAR2의 VARRAY를 객체의 VARRAY로 변환하기 위해 PL/SQL 함수를 생성해야 할 것입니다.

아래의 PL/SQL 솔루션조차도 작동이 보장된다고 말하는 것은 어렵습니다. PL/SQL Language Reference에서 생성자의 항목 순서가 항상 인덱스 순서와 일치한다고 말하는 항목을 찾을 수 없습니다. 그러나 예제는 순서가 유지된다는 것을 암시합니다. 사실이 아니라면 지금까지 만난 모든 종류의 이상한 버그가 발생할 것입니다.

내 예제는 이 아니며 중첩 된 숫자는입니다. 테이블. 설명서에서 ". 저장하고 데이터베이스에서 VARRAY를 검색 할 때, 해당 인덱스 및 요소 순서가 안정적으로 유지"

... " 중첩 테이블의 인덱스와 행 순서는 데이터베이스에서 중첩 테이블을 저장하고 검색 할 때 안정적이지 않을 수 있습니다."


SQL> create or replace type varchar2_with_index as object 
    2 (
    3  id number, 
    4  value varchar2(4000) 
    5 ); 
    6/

Type created. 

SQL> create or replace type varchar2_with_index_varray as 
    2  varray(32767) of varchar2_with_index; 
    3/

Type created. 

SQL> create or replace function add_index(p_list in sys.ODCIVarchar2List 
    2 ) return varchar2_with_index_varray as 
    3  v_new_list varchar2_with_index_varray := varchar2_with_index_varray(); 
    4 begin 
    5  for i in 1 .. p_list.count loop 
    6    v_new_list.extend; 
    7    v_new_list(v_new_list.count) := varchar2_with_index(i, p_list(i)); 
    8  end loop; 
    9  return v_new_list; 
10 end; 
11/

Function created. 

SQL> column value format a6 
SQL> select t1, t2.* from 
    2 (select 'X' as t1 from dual UNION select 'Y' from dual) t1, 
    3 table (add_index(sys.odcivarchar2list('a', 'b', 'c'))) t2; 

T   ID VALUE 
- ---------- ------ 
X   1 a 
X   2 b 
X   3 c 
Y   1 a 
Y   2 b 
Y   3 c 

6 rows selected. 
+0

감사합니다. 이것이 이전에 구현 된 방식이며 미리 정의 된 유형 만 사용하여 개선하려고했습니다. –

0

아무도이 함께 오지 왜 궁금하네요, 그래서 질문이 실제로 작업에 보장되어 있는지,하지만 여전히 내 자신의 질문

select t1, t2.* from 
(select 'X' as t1 from dual UNION select 'Y' from dual) t1, 
(select ROWNUM rn, COLUMN_VALUE from table (sys.odcivarchar2list('a', 'b', 'c'))) t2 

T1   RN COLUMN_VALUE 
--- ---------- -------------------- 
X   1 a 
X   2 b 
X   3 c 
Y   1 a 
Y   2 b 
Y   3 c 

대답 해요 100 %

관련 문제