JDBC LOB 데이터 타입 (CLOB & BLOB)
1. LOB 데이터 타입
Large Object 데이터 타입으로 대용량의 데이터를 객체형으로 저장할 수 있는 데이터 타입.
LOB 데이터 타입의 구조는 다음과 같다.
실제 데이터에 대한 위치 정보를 제공하므로, 위치 정보만 파악하고 있다가 필요한 시점에서 데이터를 전송하는 스트리밍이 가능
2. CLOB와 BLOB 데이터 타입
l CLOB 데이터 타입
n Character Large Object
n Char나 VARCHAR 또는 LONG 데이터 타입처럼 문자형 데이터를 저장하는 LOB 데이터
l BLOB 데이터 타입
n Binary Large Object
n BINARY(RAW) 또는 LONGVARBINARY(LONG RAW)데이터 타입처럼 이진형 데이터를 저장하는 LOB 데이터
3. CLOB 데이터를 삽입할 때에는 다음을 주의해야 한다.
Clob 인터페이스에는 Clob 데이터를 직접적으로 저장할 수 있는 방법을 제공하지 않는다.
CLOB 형의 객체를 생성하여 데이터베이스에 추가하는 기능은 근본적으로 제공하지 않는다. 따라서 사용자가 CLOB 객체를 생성할 수 없다. 이 문제는 데이터베이스와 JDBC 드라이버마다 서로 다른 해결책을 제시해야 한다.
4. Oracle DB에서 CLOB 데이터 추가
l empty_clob() 을 이용하여 빈 CLOB 데이터 삽입
l 실제 데이터는 비어있는 CLOB 데이터를 SELECT 문장으로 읽어와서 CLOB 데이터의 위치 정보 확인
l 해당 위치에 실제 데이터를 삽입
참고로 아 때 SELECT 되는 CLOB 데이터는 반드시 하나의 CLOB 데이터만을 조회해야 한다.
5. Java.sql.Clob 인터페이스 실습
l 명령행 매개변수로 입력된 문자열 정보를 oracle 데이터베이스 내의 CLOB 데이터 타입을 가진 컬럼으로 전송하여 삽입하고 다시 oracle 데이터베이스로부터 저장된 CLOB 데이터를 조회하는 예제
l CLOB 데이터 타입을 가진 컬럼이 존재하는 테이블이 필요하다. 따라서 다음과 같이 CLOB 데이터 타입을 가진 컬럼이 존재하는 테이블을 먼저 생성한다.
CREATE TABLE CLOBTEST ( Seq VARCHAR2(100) NOT NULL Clobdata CLOB); |
l 삽입할 데이터는 다음과 같은 형태로 명령행 매개변수로 입력받도록 한다.
seq |
Clobdata |
Clob01 |
첫번째 clob 데이터를 삽입 |
ClobInsert.java
01 import java.sql.*; 02 import java.io.Writer; 03 04 public class ClobInsert{ 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 ResultSet rs = null; 09 String seq = null; 10 String clobData = null; 11 try { 12 if(args[0] != null && args[1] != null){ 13 seq = args[0]; 14 clobData = args[1]; 15 } 16 }catch(Exception e){ 17 System.out.println 18 ("CLOBTEST 테이블에 삽입할 두개의 값을 입력하세요"); 19 return; 20 } 21 try { 22 String query1 = 23 "INSERT INTO CLOBTEST(seq, clobdata) " 24 + " VALUES (?,EMPTY_CLOB()) "; 25 String query2 = 26 " SELECT clobdata " 27 + " FROM CLOBTEST " 28 + " WHERE seq = ? FOR UPDATE "; 29 Class.forName("oracle.jdbc.driver.OracleDriver"); 30 con=DriverManager.getConnection 31 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9", 32 "jdbc00","jdbc00"); 33 con.setAutoCommit(false); 34 ps = con.prepareStatement(query1); 35 ps.setString(1,seq); 36 ps.executeUpdate(); 37 ps = con.prepareStatement(query2); 38 ps.setString(1,seq); 39 rs = ps.executeQuery(); 40 if(rs.next()){ 41 Clob tmpClob = rs.getClob(1); 42 if (tmpClob != null){ 43 oracle.sql.CLOB oraClob = 44 (oracle.sql.CLOB)tmpClob; 45 Writer writer = 46 oraClob.getCharacterOutputStream(); 47 char[] bss = clobData.toCharArray(); 48 writer.write(bss); 49 writer.flush(); 50 writer.close(); 51 } 52 } 53 con.commit(); 54 System.out.println 55 ("입력하신 내용을 clobtest 테이블에 " 56 + "저장하였습니다."); 57 System.out.println 58 ("데이터베이스에 저장한 내용을 조회하는 " 59 + "예제도 만들어보세요."); 60 rs.close(); 61 ps.close(); 62 con.close(); 63 }catch(Exception e){ 64 System.out.println 65 ("Exception이 발생했습니다." 66 + " 자세한 내용은 다음과 같습니다."); 67 System.out.println(e.toString()); 68 }finally { 69 try{ 70 if(rs != null) rs.close(); 71 if(ps != null) ps.close(); 72 if(con != null) con.close(); 73 }catch(Exception e){} 74 } 75 } 76 } |
6. Java.sql.Clob 인터페이스 실습
l ClobInsert.java에 의해 oracle 데이터베이스에 저장된 CLOB 데이터 내용을 조회하는 예제
ClobSelect.java
01 import java.sql.*; 02 03 public class ClobSelect{ 04 public static void main(String args[]){ 05 Connection con = null; 06 PreparedStatement ps = null; 07 ResultSet rs = null; 08 String seq = null; 09 try{ 10 if(args[0] != null ){ 11 seq = args[0]; 12 } 13 }catch(Exception e){ 14 System.out.println 15 ("조회할 clob 데이터의 seq 값을 입력하세요"); 16 return; 17 } 18 try{ 19 String query1 = 20 " SELECT seq, clobdata " 21 + " FROM CLOBTEST " 22 + " WHERE seq = ? "; 23 Class.forName("oracle.jdbc.driver.OracleDriver"); 24 con=DriverManager.getConnection 25 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 26 ,"jdbc00","jdbc00"); 27 ps = con.prepareStatement(query1); 28 ps.setString(1,seq); 29 rs = ps.executeQuery(); 30 if(rs.next()){ 31 seq = rs.getString(1); 32 Clob tmpClob = rs.getClob(2); 33 long start = 1; 34 int bufferSize = 1024*40; 35 StringBuffer total = new StringBuffer(); 36 String tstr = ""; 37 for ( ; ; ) { 38 tstr = tmpClob.getSubString(start, bufferSize); 39 if ((tstr != null) && !(tstr.equals(""))){ 40 total.append(tstr); 41 start += bufferSize; 42 } 43 else break; 44 } 45 System.out.println 46 ("seq : "+seq) ; 47 System.out.println 48 ("clobData : "+total.toString()) ; 49 } 50 rs.close(); 51 ps.close(); 52 con.close(); 53 }catch(Exception e){ 54 System.out.println 55 ("Exception이 발생했습니다." 56 + " 자세한 내용은 다음과 같습니다."); 57 System.out.println(e.toString()); 58 }finally{ 59 try{ 60 if(rs != null) rs.close(); 61 if(ps != null) ps.close(); 62 if(con != null) con.close(); 63 }catch(Exception e){} 64 } 65 } 66 } |
7. Java.sql.Blob 인터페이스 실습
l BLOB 데이터 조회
l 다음과 같은 BLOB 데이터 타입을 가진 컬럼이 존재하는 테이블을 먼저 생성
CREATE TABLE BLOBTEST( seq VARCHAR2(100) NOT NULL blobdata BLOB); |
l 삽입할 데이터는 이미지를 저장한 파일의 이름과 이미지 파일의 내용을 삽입
seq |
Clobdata |
Anyboy.gif |
Anyboy.gif파일의 내용을 바이너리(BINARY) 형태로 변경한 byte 배열 |
BlobInsert.java
01 import java.sql.*; 02 import java.io.*; 03 import oracle.jdbc.driver.*; 04 05 public class BlobInsert{ 06 public static void main(String args[]){ 07 Connection con = null; 08 PreparedStatement ps = null; 09 OracleResultSet rs = null; 10 try{ 11 String query1 = 12 " INSERT INTO BLOBTEST " 13 + "(seq, blobdata) " 14 + " VALUES (?,EMPTY_BLOB()) "; 15 String query2 = 16 " SELECT blobdata " 17 + " FROM BLOBTEST " 18 + " WHERE seq = ? FOR UPDATE "; 19 Class.forName("oracle.jdbc.driver.OracleDriver"); 20 con=DriverManager.getConnection 21 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 22 ,"jdbc00","jdbc00"); 23 con.setAutoCommit(false); 24 ps = con.prepareStatement(query1); 25 ps.setString(1,"anyboy.gif"); 26 ps.executeUpdate(); 27 ps = con.prepareStatement(query2); 28 ps.setString(1, "anyboy.gif"); 29 rs = (OracleResultSet)ps.executeQuery(); 30 File file = null; 31 if(rs.next()){ 32 oracle.sql.BLOB tmpBlob = 33 ((OracleResultSet)rs).getBLOB (1); 34 try{ 35 file = new File("anyboy.gif"); 36 FileInputStream instream = 37 new FileInputStream(file); 38 OutputStream outstream = 39 tmpBlob.getBinaryOutputStream(); 40 int size = tmpBlob.getBufferSize(); 41 byte[] buffer = new byte[size]; 42 int length = -1; 43 while((length = instream.read(buffer))!= -1){ 44 outstream.write(buffer, 0, length); 45 } 46 instream.close(); 47 outstream.close(); 48 }catch (java.io.FileNotFoundException fe) { 49 System.err.println (file.getName() 50 + " 파일이 존재하지 않습니다."); 51 } 52 } 53 con.commit(); 54 System.out.println 55 ("지정하신 " + file.getName() 56 + " 파일을 blobtest 테이블에 " 57 + " 저장하였습니다."); 58 System.out.println 59 ("데이터베이스에 저장한 내용을 조회하는 " 60 + "예제도 만들어보세요."); 61 rs.close(); 62 ps.close(); 63 con.close(); 64 }catch(Exception e){ 65 System.out.println 66 ("Exception이 발생했습니다." 67 + " 자세한 내용은 다음과 같습니다."); 68 System.out.println(e.toString()); 69 }finally { 70 try{ 71 if(rs != null) rs.close(); 72 if(ps != null) ps.close(); 73 if(con != null) con.close(); 74 }catch(Exception e){} 75 |
8. Java.sql.Blob 인터페이스 실습
BlobSelect.java
01 import java.sql.*; 02 import java.io.*; 03 04 public class BlobSelect{ 05 public static void main(String args[]){ 06 Connection con = null; 07 PreparedStatement ps = null; 08 ResultSet rs = null; 09 String seq = null; 10 try { 11 String query1 = 12 " SELECT blobdata " + 13 " FROM BLOBTEST " + 14 " WHERE seq = ?"; 15 Class.forName("oracle.jdbc.driver.OracleDriver"); 16 con=DriverManager.getConnection 17 ("jdbc:oracle:thin:@127.0.0.1:1521:ora9" 18 ,"jdbc00","jdbc00"); 19 ps = con.prepareStatement(query1); 20 ps.setString(1,"anyboy.gif"); 21 rs = ps.executeQuery(); 22 if(rs.next()){ 23 oracle.jdbc.OracleResultSet oracleRs = 24 (oracle.jdbc.OracleResultSet)rs; 25 Blob b = oracleRs.getBlob(1); 26 InputStream binstr = b.getBinaryStream(); 27 FileOutputStream foStream = 28 new FileOutputStream("anyboy_db.gif"); 29 byte abyte0[] = new byte[4096]; 30 int i; 31 while((i = binstr.read(abyte0)) != -1){ 32 foStream.write(abyte0, 0, i); 33 } 34 binstr.close(); 35 } 36 System.out.println 37 ("blobtest 테이블에 저장된 blob 데이터를 "); 38 System.out.println 39 ("지정하신 anyboy_db.gif 파일에 저장했습니다."); 40 rs.close(); 41 ps.close(); 42 con.close(); 43 }catch(Exception e){ 44 System.out.println 45 ("Exception이 발생했습니다." 46 + " 자세한 내용은 다음과 같습니다."); 47 System.out.println(e.toString()); 48 }finally{ 49 try{ 50 if(rs != null) rs.close(); 51 if(ps != null) ps.close(); 52 if(con != null) con.close(); 53 }catch(Exception e){} 54 } 55 } 56 } |