2008. 7. 26. 20:26

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        }