XMLTABLE 함수로 DUMMY 데이터를 생성해보자.
아래 쿼리는 순번을 생성한다. 실행 계획을 확인해보면 Pipelined Function으로 동작하는 것을 확인할 수 있다. 보통 DUAL CONNECT BY 방식을 사용하지만 해당 방식은 행수가 많은 경우 메모리 부족 에러가 발생할 수 있다.
-- 1 SELECT ROWNUM AS c1 FROM XMLTABLE ('1 to 5'); C1 -- 1 2 3 4 5 5 행이 선택되었습니다. ------------------------------------------------------------------- | Id | Operation | Name | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | COLLECTION ITERATOR PICKLER FETCH| XQSEQUENCEFROMXMLTYPE | -------------------------------------------------------------------
COLUMNS 표현식을 사용하면 특정 구간의 순번을 생성할 수도 있다.
-- 2 SELECT * FROM XMLTABLE ('11 to 15' COLUMNS c1 NUMBER PATH '.'); C1 -- 11 12 13 14 15 5 행이 선택되었습니다.
특정 숫자를 지정하려면 숫자를 쉼표(,)로 구분하면 된다.
--3 SELECT * FROM XMLTABLE ('1,1,2,3,5' COLUMNS c1 NUMBER PATH '.'); C1 -- 1 1 2 3 5 5 행이 선택되었습니다.
FLWOR 표현식을 사용하면 좀 더 복잡한 수열을 생성할 수 있다. 아래 쿼리는 홀수 결과만 반환한다.
-- 4 SELECT * FROM XMLTABLE ('for $i in 1 to 10 where $i mod 2 = 1 return $i' COLUMNS c1 NUMBER PATH '.'); C1 -- 1 3 5 7 9 5 행이 선택되었습니다.
for 문을 중첩할 수도 있다. 실행 계획을 확인해보면 카티시안 곱으로 수행되는 것을 확인할 수 있다.
-- 5 SELECT * FROM XMLTABLE ('for $i in 1 to 2, $j in 1 to 2 let $v := $i * $j return $v' COLUMNS c1 NUMBER PATH '.'); C1 -- 1 2 2 4 4 행이 선택되었습니다. --------------------------------------------------------------------- | Id | Operation | Name | --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | MERGE JOIN CARTESIAN | | | 2 | COLLECTION ITERATOR PICKLER FETCH | XQSEQUENCEFROMXMLTYPE | | 3 | BUFFER SORT | | | 4 | COLLECTION ITERATOR PICKLER FETCH| XQSEQUENCEFROMXMLTYPE | ---------------------------------------------------------------------
쌍따옴표(")를 사용하면 문자열을 생성할 수 있다.
-- 5 SELECT * FROM XMLTABLE ('"A","B","C"' COLUMNS c1 VARCHAR2(1) PATH '.'); C1 -- A B C 3 행이 선택되었습니다.
'Oracle > SQL' 카테고리의 다른 글
클로저 테이블 #1 (0) | 2019.01.31 |
---|---|
화물수량별 차등운임 계산 (0) | 2018.12.27 |
CLOB, BLOB 더미 데이터 생성 (0) | 2018.10.15 |
NLS_DATE_FORMAT 파라미터와 데이터 변환 (0) | 2018.09.01 |
날짜 기간 조회 (0) | 2018.03.07 |