CLOB TEXT 데이타를 저장하고, 조회하는 예제

by 조쉬 posted Dec 08, 2016
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
ORACLE.SQL.CLOB CLASS를 이용하여 4000 BYTES이상의 CLOB TEXT 데이타를 저장하고, 조회하는 예제 
====================================================================== 


PURPOSE 
------- 
jdbc의 standard method인 setClob, setObject로 LOB type의 데이타를 입력하는 
경우에는 4000 bytes이상이 되면 오류가 발생하여 허용하지 않는다. 
oracle.sql.CLOB class를 이용하여 이 제한과 관계없이 CLOB column에 데이타를 
입력하고 조회하는 예제를 살펴본다. 


Explanation 
----------- 
CLOB type에 text를 insert하기 위한 oracle.sql.CLOB.putString을 사용하고, 
입력된 데이타에 대한 조회를 위해서는 CLOB.getCharacterStream을 사용한다. 

JDBC 2.0에서 java.sql에서 제공하는 class는 Clob이고, oracle.sql에서 제공하는 
class는 CLOB으로 대소문자에 차이가 있음을 구별한다. 
오라클의 CLOB/BLOB 처리를 위해서는 oracle.sql.CLOB과 oracle.sql.BLOB을 사용 
하도록 권한다. 


[참고] 이 문서에서는 변수에 text data를 넣어 입력하고, 조회한것은 화면에 
       display하였다. text file을 읽어 CLOB에 저장하거나 CLOB 데이타를 화일에 
       입력하는 것은 다른 class와 method가 사용되므로 별도의 bulletin으로 
       작성하였다. 다음 bulletin을 참조한다. 
       <Bulletin No: 19341>: FILE을 CLOB에 INSERT하고, 반대로 컬럼을 읽어 FILE로 
                             WRITE하는 JDBC PROGRAM 예제 (JDBC 8.1 이상) 



Example 
-------- 

1. 테이블의 생성과 데이타 입력 

미리 다음 작업이 수행되어 있어야 하며, 이 작업도 java application내에 
statement.execute를 통해 포함시킬 수 있다. 

   sqlplus scott/tiger 
   SQL> create table test_clob(id number, c clob);   
   SQL> insert into test_clob values (1, empty_clob()); 

2. ClobHandle.java 

다음 내용을 ClobHandle.java라는 이름으로 생성한 후, 다음과 같이 compile후 
실행한다. 

   os>javac ClobHandle.java 
   os>java ClobHandle 

-------------------------------------------------------------------------------   

   import java.sql.*; 
   import java.io.*; 
   import oracle.jdbc.*; 
   import oracle.sql.*; 


   public class ClobHandle 
   { 
   public static void main (String args [])  throws Exception 
   { 
     Connection   conn; 

     DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver() ); 
     conn = DriverManager.getConnection( "jdbc:oracle:thin:@krint-5:1521:ORA920" 
, "scott","tiger" ); 

     conn.setAutoCommit (false); 

     Statement stmt = conn.createStatement (); 
     try 
     { 
       CLOB lob_loc = null; 

       String buf = new String ("Some Text To Write"); 

       ResultSet rset = stmt.executeQuery 
                ( "SELECT c FROM test_clob WHERE id = 1 FOR UPDATE"); 

       if (rset.next()) 
       { 
           lob_loc = ((OracleResultSet)rset).getCLOB (1);   
       } 

       long pos = 0; // CLOB 데이타가 insert되는 위치의 offset값을 나타낸다. 
       long length = 0; 
       pos = lob_loc.length()+1; 

       // CLOB.putString이 buf에 담긴 데이타를 해당 CLOB 컬럼에 update하는 
       // 작업을 하게 된다. 
       lob_loc.putString(pos, buf); 
     
       conn.commit(); 


       rset = stmt.executeQuery 
                ( "SELECT c FROM test_clob WHERE id = 1 FOR UPDATE"); 

       if (rset.next()) 
       { 
           lob_loc = ((OracleResultSet)rset).getCLOB (1);   
       } 

       dumpClob(lob_loc); 

       stmt.close(); 
       conn.commit(); 
       conn.close(); 
     } 
     catch (SQLException e) 
     { 
             e.printStackTrace(); 
     } 
   } 

   // --------------------------------------------------------------- 
   // CLOB 컬럼의 데이타를 10글자씩 끊어서 화면에 display한다. 
   static void dumpClob (CLOB clob) 
      throws Exception 
   { 
     Reader instream = clob.getCharacterStream(); 

     char[] buffer = new char[10]; 
     int length = 0; 

     while ((length = instream.read(buffer)) != -1) 
     { 
      System.out.print("Read " + length + " chars: "); 

      for (int i=0; i<length; i++) 
               System.out.print(buffer[i]); 
      System.out.println(); 
     } 

    instream.close(); 
   } 
   } 


Reference Documents 
------------------- 
<Note:68349.1> 8i: JDBC Support for BLOB/CLOB 
<Note:103492.1> Example: Using the JDK 1.2 (JDBC 2.0) Clob and Blob Classes 
<Note:157704.1> Errors when inserting LOB data using standard JDBC methods 
Application Developers Guide - Large Objects (LOBs) using Java 

Articles

1 2 3 4 5 6 7