본문 바로가기

카테고리 없음

ORACLE CONNECT BY PATH v1.0

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 개의 행이 선택되었습니다.