Nekr Blog


START WITH와 CONNECT BY 는 오라클에서만 가능한 함수로서 데이터를 계층구조로 가져올 수 있다.

◈ START WITH
    - 계층 질의의 루트(부모행)로 사용될 행을 지정 합니다..
    - 서브쿼리를 사용할 수도 있습니다.

◈ CONNECT BY
    - 이 절을 이용하여 계층 질의에서 상위계층(부모행)과 하위계층(자식행)의 관계를 규정 합니다.
    - 보통 PRIOR 연산자를 많이 사용 합니다..
    - 서브쿼리를 사용할 수 없습니다..
    - PRIOR이 붙는 column 이 가져온 row 의 column을 의미한다. 즉 상위에 존재할 데이타가 되게 된다. 어느쪽에 붙느냐 잘 따져 본다.

◈ CONNECT BY의 실행순서는 다음과 같습니다.
    - 첫째 START WITH절
    - 둘째 CONNECT BY 절
    - 세째 WHERE 절 순서로 풀리게 되어있습니다.

◈ SYNTEX

SELECT 
FROM 
START WITH
CONNECT BY PRIOR
AND 
ORDER SIBLINGS BY
or
SELECT 
FROM 
WHERE
START WITH
CONNECT BY PRIOR
ORDER SIBLINGS BY

◈ 이용
    1) 쇼핑목 카테고리 관계 - 대분류, 중분류, 소분류 등을 트리 구조로
    2) 게시판 에서 일반글 과 답글과의 관계 등을 트리 구조로

◈ 데이터가 많아질 경우....
    - 첫째로 풀리는 START WITH job='PRESIDENT' job 컬럼에 index가 생성되어 있지 않는다면 속도를 보장할 수 없습니다.
    - 그리고 둘째로 풀리는 CONNECT BY PRIOR empno = mgr 역시 PRIOR 쪽의 컬럼값이 상수가 되기 때문에 MGR컬럼에 index를 생성하여야 CONNECT BY의 속도를 보장할 수 있습니다.
    - 계층구조를 CONNECT BY, START WITH로 풀면 부분범위 처리가 불가능하고 Desc으로 표현하기가 어렵 습니다.

◈ 예제

SELECT A.BBSSEQ, LPAD(' ', LEVEL * 4) ||  A.title
 FROM (
   SELECT *
   FROM KBBS02MT
   WHERE SITECD = 'ART'
   AND BBSCD='AR2'
 ) A
-- START WITH UppBBsSeq IN (select UppBBsSeq='0' or UppBBsSeq='1')
START WITH UppBBsSeq = '0'    //일종의 WHERE절. UppBBsSeq가 0인 레코드부터 계층적 쿼리 수행
CONNECT BY PRIOR BbsSeq = UppBbsSeq
//CONNECT BY - 각각의 행들이 어떻게 연결되어야 하는지(JOIN) 정보를 작성한다.
//PRIOR - BbsSeq를 참조하는 UppBbsSeq 컬럼이 속한 레코드를 모두 찾아라.(하위seq를 찾을 수 있다) 


◈ LEVEL 키워드 - 오라클에서 실행되는 쿼리내 ROWNUM과 같은 가상컬럼이다.

SELECT A.BBSSEQ, LPAD(' ', LEVEL * 4) ||  A.title
 FROM (
   SELECT *
   FROM KBBS02MT
   WHERE SITECD = 'ART'
   AND BBSCD='AR2'
 ) A
START WITH UppBBsSeq = '0' 
CONNECT BY PRIOR BbsSeq = UppBbsSeq AND LEVEL < 3     //CONNECT BY 절내에 위치



JSP에서 알면 간단하면서도 모르면 고생하는 것이 날짜를 받아서 DB에 넣는 것이 아닐까요?

입력이 request를 통해 들어올 때 getParameter 메소드로는 문자열 밖에 못 받는데, 이걸 DB에서 인식하는 Timestamp 형태로 바꾸기 위해서 가장 무식한 형태는 년,월,일,시,분,초 형태로 짤라서 넣기 ㅡ.ㅡ;

이걸 Date로 넣을 경우 오류가 발생하기도 해서 java.sql.date를 안 쓰고 java.sql.timestamp를 쓰는데 정말 간단한 형태를 지원합니다.

Timestamp.valueOf("2009-03-01 10:10:05"); 형태로 집어넣는 겁니다.

그러기에 이를 쓰기 위한 메소드는 두 줄이면 끝납니다.

import java.sql.Timestamp;

public Timestamp getTimestamp(String str){
    return Timestamp.valueOf(str);
}
위의 문자열 형태는 규칙에 따르면 yyyy-mm-dd hh:mm:ss.fffffffff 형식입니다.
위에서 보는 것과 같이 timestamp는 나노 세컨드까지 지원하는 반면, java.sql.date는 밀리 세컨드까지만 지원합니다.
이 때문에 처리할 때 좀 달라지는 경우가 생깁니다.

'JAVA' 카테고리의 다른 글

[JAVA] 이미지(Image)사이즈 얻기  (0) 2009.12.01
[JAVA] Java Serialization  (0) 2009.11.24
[JAVA/TOMCAT/SESSION] HTTPS<->HTTP, 세션 공유  (1) 2009.11.24