ORACLE CONNECT BY LEVEL
from
1.
CONNECT
BY LEVEL
순환쿼리를 이용해 가상의 데이터를 만들 때 사용한다. 일반적으로
순환쿼리의 connect by 절 뒤에 실제 컬럼의 관계를 표현하는데 이곳에 LEVEL 을 사용하는 것이 다른 점이다. 다음의 쿼리를 보면 그
이해가 쉬울 것이다.
SQL> select
level,sys_connect_by_path(level,'/') path from dual
2 connect by level < 10
3 /
LEVEL PATH
----------
----------------------------------------
1 /1
2 /1/2
3 /1/2/3
4 /1/2/3/4
5 /1/2/3/4/5
6 /1/2/3/4/5/6
7 /1/2/3/4/5/6/7
8 /1/2/3/4/5/6/7/8
9 /1/2/3/4/5/6/7/8/9
9 개의 행이
선택되었습니다.
위에서 LEVEL 은 순환쿼리의 depth 를 가리키는 가상컬럼이다. sys_connect_by_path 는
계층 구조를 표현해주는 함수이다. 결과를 보면 row가 늘어날수록
계층의 depth 가 늘어나는 걸 알 수 있다.
2.
CONNECT
BY LEVEL 의 활용
<숫자집합>
SQL> select level from dual
2 connect by level < 10
3 /
LEVEL
----------
1
2
3
4
5
6
7
8
9
9 개의 행이 선택되었습니다.
간단히 사용하면 위와같이 level 만 정의해서 사용하면 된다. 특정 숫자가 필요하다면 level 컬럼을 가공하면 된다.
SQL> ed
file afiedt.buf(이)가 기록되었습니다
1 select level+5 from dual
2*
connect by level < 5
SQL> /
LEVEL+5
----------
6
7
8
9
<날짜만들기>
아래와 같이 만들면 년/월 의 경계값다 잘 바뀌는걸 볼 수
있다. 연도의 앞 두자리는 NLS_DATE_FORMAT 으로인해
잘려 나오는 것이다.
SQL> ed
file afiedt.buf(이)가 기록되었습니다
1 select
to_date('20010323','YYYYMMDD') + level from dual
2*
connect by level < 30
SQL> /
TO_DATE(
--------
01/03/24
~~중략~~
01/03/30
01/03/31
01/04/01
~~중략~~
01/04/20
01/04/21
29 개의 행이
선택되었습니다.
<특정날짜집합
만들기>
var st number;
var ed number;
exec :st := 20100220
exec :ed := 20100304
select to_date(:st,'YYYYMMDD') + level -1
from dual
connect by level < (select
to_date(:ed,'YYYYMMDD') - to_date(:st,'YYYYMMDD') + 2 from dual)
/
SQL> @dt
PL/SQL 처리가
정상적으로 완료되었습니다.
PL/SQL 처리가
정상적으로 완료되었습니다.
TO_DATE(
--------
10/02/20
~~중략~~
10/02/28
10/03/01
~~중략~~
10/03/04
13 개의 행이
선택되었습니다.