Oracle Database TIP
오라클 clob JDBC 예제 15 3 30,092

by 김정식 CLOB JDBC EMPTY_CLOB() [2005.10.11]


출처 : http://www.kkaok.pe.kr/lecture/clob/clob.html

오라클 clob 예제

by kkaok
2003-06-27

 

Lob type이란?

lob(Large Object) 타입은 대용량 데이터를 저장하기위한 데이터 타입으로 오라클 8버전부터 지원된다.

 

Lob 타입의 특징

이전에 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었다. 그런데 이 칼럼은 한테이블에 하나만 사용할 수 있으며 최대 크기가 2GB였다. 더군다나 검색을 구현하기가 어려워 포기를 해야 했다. 그래서 이런 문제를 보안하기 위 나온 것이 Lob 타입이다. Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 최대 크기가 4GB이다. 또한 long 타입보다 훨씬 쉬운 검색기능을 제공한다.

 

Lob type의 종류

이전에 대용량 처리는 long 타입으로 처리를 할 수 밖에 없었다. 그런데 이 칼럼은 한테이블에 하나만 사용할 수 있으며 최대 크기가 2GB였다. 더군다나 검색을 구현하기가 어려워 포기를 해야 했다. 그래서 이런 문제를 보안하기 위 나온 것이 Lob 타입이다. Lob 타입은 테이블에 여러개의 컬럼을 생성할 수 있으며 최대 크기가 4GB이다. 또한 long 타입보다 훨씬 쉬운 검색기능을 제공한다.

BLob (Binary Large Object), 이진 바이너리 데이터의 저장시 사용된다.
CLob (Character Large Object), 문서 데이터의 저장시 사용된다.
BFILE 외부 파일에 저장된 이진 데이터가 있는 경로의 저장시 사용된다.

 

Clob에 저장하기

1: import java.sql.*;
  2: import java.io.*;
  3: import oracle.sql.*;
  4: import oracle.jdbc.driver.*;
  5: ...
  6: 
  7: public void insertQuery(UploadBoard up,int re_step,int re_level) 
         throws Exception  
  8: {
  9:   ResultSet rs   = null;
 10:   PreparedStatement pstmt = null;
 11:   Connection conn = null;
 12:   String query = "insert into "+up.getTableName()+" (seq,re_step,
           re_level,name,title,pwd,email,readnum,writeday,ip,relativeCnt,
               homepage,imgInfo,content,tag) 
                   values(?,?,?,?,?,?,?,0,sysdate,?,0,?,?,empty_clob(),?)";
오라클 명령어 empty_clob()을 이용해 공간을 확보한다.
13: try{ 14: conn = DBManager.getClobConnection(); 15: conn.setAutoCommit(false);
CLOB column을 업데이트 하는동안 다른 process의 접근을 막기위해
setAutoCommit(false)를 반드시 설정해야 한다. 이부분이 가장 중요하다.
16: pstmt = conn.prepareStatement(query); 17: pstmt.setInt(1,up.getSeq()); 18: pstmt.setInt(2,re_step); 19: pstmt.setInt(3,re_level); 20: pstmt.setString(4,up.getName()); 21: pstmt.setString(5,up.getTitle()); 22: pstmt.setString(6,up.getPwd()); 23: pstmt.setString(7,up.getEmail()); 24: pstmt.setString(8,up.getIp()); 25: pstmt.setString(9,up.getHomepage()); 26: pstmt.setString(10,up.getImgInfo()); 27: pstmt.setString(11,up.getTag()); 28: pstmt.executeUpdate(); 29: pstmt.close(); 30: String query2 = " select /*+ index_desc("+up.getTableName()+ " "+up.getTableName()+"_indx) */ content from "+ up.getTableName()+" where seq = ? for update ";
for update를 이용해 CLOB column을 lock한다.
31: pstmt = conn.prepareStatement(query2); 32: pstmt.setInt(1,up.getSeq()); 33: rs = pstmt.executeQuery(); 34: if(rs.next()) { 35: CLOB clob = ((OracleResultSet)rs).getCLOB(1); 36: Writer writer = clob.getCharacterOutputStream(); 37: Reader src = new CharArrayReader(up.getContent().toCharArray()); 38: char[] buffer = new char[1024]; 39: int read = 0; 40: while ( (read = src.read(buffer,0,1024)) != -1) { 41: writer.write(buffer, 0, read); // write clob. 42: } 43: src.close(); 44: writer.close(); 45: } 46: conn.commit(); 47: conn.setAutoCommit(true);
CLOB column에 데이터을 저장하였다면 commit()을 실행시키고
conn.setAutoCommit(true)로 다시 설정한다.
48: }finally{ 49: DBManager.close(rs,pstmt,conn); 50: } 51: }

 

Clob 불러오기

...
  1: public BoardTable getViewData(String tableName,int seq) throws Exception
  2: {
  3:   BoardTable bTable = new BoardTable();
  4:   String query = " select * from "+tableName+" where seq = ? ";
  5:   ResultSet rs = null;
  6:   PreparedStatement pstmt = null;
  7:   Connection conn = null;
  8:   try{
  9:     conn = DBManager.getConnection();
 10:     pstmt = conn.prepareStatement(query);
 11:     pstmt.setInt(1,seq);
 12:     rs = pstmt.executeQuery();
 13:     if (rs.next()) {
 14:       ...
 15:       ...      
 16:       StringBuffer output = new StringBuffer();
 17:       Reader input = rs.getCharacterStream("content");
 18:       char[] buffer = new char[1024];
 19:       int byteRead;
 20:       while((byteRead=input.read(buffer,0,1024))!=-1){
 21:         output.append(buffer,0,byteRead);
 22:       }
 23:       input.close();
 24:       bTable.setContent(output.toString()); 
CLOB 데이터를 불러오기 위해서는 위에서처럼
rs.getCharacterStream("content")로 불러서 StringBuffer에 담아야 한다.
25: ... 26: ... 27: } 28: } finally { 29: DBManager.close(rs,pstmt,conn); 30: } 31: return bTable; 32: }

 

http://www.kkaok.pe.kr

- 강좌 URL : http://www.gurubee.net/lecture/1870

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 김정식 [2005.10.11 18:50:46]
제가 강좌를 따로 작성하려다.
까오기님께서 잘 작성한 예제가 있어서 담아 왔습니다. ^^

by 임성남 [2006.02.01 09:01:14]
좋군요.^^

by 이인환 [2009.07.13 20:54:41]
BLOB 타입으로 이미지 파일을 넣고, 읽어오려고 하는데 잘안되네요ㅠㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입