알아두면 편한 DBMS_LOB 관련 함수

* DBMS_LOB.SUBSTR(CLOB_컬럼, 가져올 길이, OFFSET)                                <= SELECT
* DBMS_LOB.INSTR(CLOB_컬럼, '검색할 단어', OFFSET, 몇 번째 위치한 단어)    <= WHERE
* DBMS_LOC.GETLENGTH(CLOB_컬럼)                                                      <= 해당컬럼의 전체길이를 반환


[Ex. 01]
SELECT  DBMS_LOB.GETLENGTH(CONTENTS) AS CON_LENGTH   <= 해당 CLOB_컬럼의 전체 길이를 반환
  FROM  BOARD
 WHERE  DOMAIN_CODE = 10012
   AND  DBMS_LOB.INSTR(CONTENTS, 'Cookie', 1, 1) > 0        <=CLOB_컬럼에서 'Cookie'라는 단어가 들어가 있는 조건

/* 여기서 CONTENTS컬럼은 CLOB타입이다. */

[결과]
CON_LENGTH
--------------
      896  --------- ⓐ
      715  --------- ⓑ

- 추가 설명 -
위의 결과를 보면 2개의 row가 검색됐다. 즉 'Cookie'라는 단어가 들어가 있는 CONTENTS는 총 2개의 행이다.
만약 ⓐ결과의 컬럼에 'Cookie'라는 단어는 1개
       ⓑ결과의 컬럼에 'Cookie'라는 단어는 3개 있다고 가정할 때
DBMS_LOB.INSTR(CONTENTS, 'Cookie', 1, 1) > 0
는 위와 같은 결과가 나오지만
DBMS_LOB.INSTR(CONTENTS, 'Cookie', 1, 2) > 0 이라고 하면 ⓑ 행의 715라는 결과만 보여주게 된다.
그 이유는 ⓐ에는 'Cookie'라는 단어가 총 1개밖에 없기 때문에 DBMS_LOB.INSTR()의 조건에 맞지 않는다.
'몇 번째 위치한 단어'의 조건 중 ⓐ에는 2번째에 위치한 'Cookie'가 없기 때문이다.(1개만 존재하지 때문에)


[Ex. 02]
SELECT  DBMS_LOB.SUBSTR(CONTENTS, DBMS_LOB.GETLENGTH(CONTENTS), 1) AS LOB_CONTENTS     <=CLOB_컬럼의 내용을 보여줌
  FROM  BOARD
 WHERE  DOMAIN_CODE = 10012
   AND  DBMS_LOB.INSTR(CONTENTS, 'Cookie', 1, 1) > 0


[결과]
LOB_CONTENTS
--------------------------------
aafagrek dasgew fgwfafd sdfe....
any learners, who are diffic....

- 추가 설명 -
CONTENTS컬럼의 처음길이(1)부터 전체길이(GETLENGTH(CONTENTS))까지를 보여주게 된다.(사용자 지정가능)
여기서 OFFSET을 5로 설정한다면
결과는
grek dasgew ....
learners, wh....
이런식의 결과가 나오게 된다.


위의 방식되로 하면..CLOB타입의 결과를 그냥 가져올 수 있기 때문에 게시판 같은 경우 저렇게 코딩해서 가져오면 되지 않느냐? 라고 할수도 있겠지만 조건절이 없을 경우(LIST처럼) CLOB가 너무커서 많은 데이터를 가져오면 DB BUFFER가 ERROR나게 된다.

'프로그램 > DB' 카테고리의 다른 글

oracle 버전 정보 알아내기  (0) 2010.01.26
[TOAD] 토드에서 CLOB 타입 보기  (1) 2009.09.15
집합 쿼리(UNION, INTERSECT, MINUS)  (0) 2009.04.01
[오라클] - SIGN()함수  (0) 2009.04.01
[펌] - ROLLUP operator  (0) 2009.03.27

+ Recent posts