Oracle/SQL2018. 12. 17. 13:12

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
Posted by 정희락_