======================================================================
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