2017-12-17 1 views
1

멀티 세트 &을 SYS.ODCIVARCHAR2LIST 등으로 사용하여 많은 답변을 보았습니다. 논리적 인 논리를 이해하지 못했습니다. 아래 예제를 찾으십시오 (실제로 다른 질문에서 가져옴). 워크 플로우 설명/멀티 세트 이해를위한 작업을 요청하십시오. 그리고 예. 관련 문서를 읽으려고했습니다.오라클의 장점과 장점, 중요성

CREATE TABLE table_name (Id, Column1, Column2) AS 
SELECT 1, 'A,B,C', 'H' FROM DUAL UNION ALL 
SELECT 2, 'D,E', 'J,K' FROM DUAL UNION ALL 
SELECT 3, 'F',  'L,M,N' FROM DUAL; 

쿼리 :

SELECT t.id, 
     c1.COLUMN_VALUE AS c1, 
     c2.COLUMN_VALUE AS c2 
FROM table_name t 
     CROSS JOIN 
     TABLE(
     CAST(
      MULTISET(
      SELECT REGEXP_SUBSTR(t.Column1, '[^,]+', 1, LEVEL) 
      FROM DUAL 
      CONNECT BY LEVEL <= REGEXP_COUNT(t.Column1, '[^,]+') 
      ) AS SYS.ODCIVARCHAR2LIST 
     ) 
     ) c1 
     CROSS JOIN 
     TABLE(
     CAST(
      MULTISET(
      SELECT REGEXP_SUBSTR(t.Column2, '[^,]+', 1, LEVEL) 
      FROM DUAL 
      CONNECT BY LEVEL <= REGEXP_COUNT(t.Column2, '[^,]+') 
      ) AS SYS.ODCIVARCHAR2LIST 
     ) 
     ) c2 

결과 : : 사전에

| ID | C1 | C2 | 
|----|----|----| 
| 1 | A | H | 
| 1 | B | H | 
| 1 | C | H | 
| 2 | D | J | 
| 2 | D | K | 
| 2 | E | J | 
| 2 | E | K | 
| 3 | F | L | 
| 3 | F | M | 
| 3 | F | N | 

감사합니다.

답변

2

오라클은 세 가지 유형의 콜렉션을 제공합니다. 다른 언어에서는 "어레이"라는 용어가 더 많이 사용됩니다.

    (또는 테이블 인덱스에 의해)
  • 연관 배열
  • VARRAY (가변 크기 어레이)
  • 중첩 테이블

의 차이와 위치를 확인하기 위해 Collections Types를 보라 하나를 사용할 수 있습니다.

간단한 것으로 시작하십시오. 당신은 여러 가지 방법으로 사용할 수 있습니다

create type number_table_type as table of number; 

, 세 selects은 동일합니다. 모두 emp 테이블을 선택하고 emp_id 값을 중첩 테이블 emp_T에 저장합니다. 대향 방법을

create table emp (
    emp_id number, 
    emp_name varchar2(100)); 

insert into emp values (10, 'Scott'); 
insert into emp values (20, 'King'); 
insert into emp values (30, 'Tiger'); 


declare 
    emp_T number_table_type: 
begin 
    select cast(collect(emp_id) as number_table_type) 
    into emp_T 
    from emp; 

    select emp_id 
    bulk collect into emp_T 
    from emp; 

    SELECT CAST(MULTISET(SELECT emd_id FROM emp) AS number_table_type) 
    into emp_T 
    FROM dual; 

    emp_T := number_table_type(10,20,30); 

    for i in 1..3 loop 
     emp_T.EXTEND; 
     emp_T(i) := 10*i; 
    end loop; 
end; 

, 즉 '정상'표 사용 TABLE 함수에 중첩 테이블을 변형 :

select * 
from TABLE(emp_T); 

오라클 Multiset OperatorsMultiset Conditions 제공한다.두 개의 배열을 결합하거나 값을 구별하는 등의 기능을 제공합니다. 많은 경우 Mulitset 연산자/조건이 단일 명령으로 동일한 작업을 수행하는 코드에 LOOP을 쓰는 경우가 많습니다.

일단 기본 배열에 익숙해지면 복잡한 구조를 시도해 볼 수도 있습니다. 그러나, 그런 복잡한 구조는 교육 자료와 문서화에서는 꽤 흔하지만 실제 생활에서는 거의 사용되지 않는다는 느낌이 들었다. 오라클의 강점은 객체 지향 데이터보다는 관계형 데이터를 저장하고 조작하는 것입니다.

SYS.ODCIVARCHAR2LIST, et al. 단지 약간 predefined types입니다. 실제로 당신이 그들을 사용하거나 당신 자신의 유형을 만드는 것은 중요하지 않습니다.

1

글쎄, 당신은 가장 깊은 수준에서 그런 코드를 검토하고 무슨 일이 일어나고 있는지 파악하기 위해 위로 이동해야합니다.

이것은 테이블의 첫 번째 행을 기반으로합니다. 보시다시피, "regexp"마법은 쉼표로 구분 된 값 (즉, 열)을 행으로 변환합니다. CAST는 SYS.ODCIVARCHAR2LIST 방식으로 그것을 "변환"동안

SQL> with test as 
    2 (select 1, 'A,B,C' column1 from dual) 
    3 select regexp_substr(t.column1, '[^,]+', 1, level) 
    4 from test t 
    5 connect by level <= regexp_count(t.column1, '[^,]+'); 

REGEXP_SUBSTR(T.COLU 
-------------------- 
A 
B 
C 

SQL> 

MULTISET는, 그 값 "수집"을 생성한다. 보시다시피, SYS 소유이며 VARCHAR2 값이 들어있는 (CREATE TYPE 명령을 사용하여) 고유 한 유형을 작성한 것처럼 작동합니다. 유형이이 유형 또는 유형이 단순한 경우 (SYS.ODCINUMBERLIST를 사용하므로) 고유 한 유형을 작성하는 대신 사전 정의 된 유형을 사용할 수 있습니다. 따라서 컬렉션에는 A, B 및 C가 포함됩니다.

마지막으로 TABLE 함수는 마치 "일반"테이블 인 것처럼 쿼리 할 수있는 행 모음을 생성합니다.

+0

답변 해 주셔서 감사합니다. – pOrinG