4,516,686 th visitor since 2017.2.1 ( Today : 7253 )
Programming
No. 514
Name. deok1
Subject. WebSphere Oracle CLOB 입력
Main Cate. Oracle
Sub Cate. JSP/Servlet , Oracle , Java
Date. 2008-12-26 18:39
Hit. 5328 (211.43.206.101)
File.
@ 개발환경 요약
WAS : IBM WebSphere 5.1.1.13
DB : Oracle9i 9.2.0.7.0

방법 1) 우선 WAS의 특성을 타지 않도록 아래와 같이 작업해 본다.
----------------------------------------------------------------------------------
conn.setAutoCommit(false);
stmt = conn.createStatement();

// CLOB 필드를 초기화 한다.
sql = "UPDATE "+tableNm+" SET "+clobFld+"=EMPTY_CLOB() WHERE "+whereQuery;
stmt.executeUpdate(sql);
if(stmt!=null){
    stmt.close();
}

// CLOB 필드에 값을 입력한다.
sql = "SELECT "+clobFld+" FROM "+tableNm+" WHERE "+whereQuery+" FOR UPDATE";
rs = stmt.executeQuery(sql);

CLOB clob = null;
if(resultSet.next()){
    //가져온 CLOB 타입을 orale.sql.CLOB 타입으로 변환.
clob = (oracle.sql.CLOB)resultSet.getClob(1);

    Writer writer = clob.getCharacterOutputStream();
    Reader src = new CharArrayReader(value.toCharArray());
    char[] buffer = new char[1024];
    int read = 0;
    while ( (read = src.read(buffer,0,1024)) != -1){
     writer.write(buffer, 0, read);
    }
    src.close();
    writer.close();
}
conn.sestAutoCommit(true);
----------------------------------------------------------------------------------
위 방법으로 문제가 없다면 그대로 하면 된다.
만약 위의 방법으로 안된다면 아래의 방법을 이용해 본다.


방법 2) 웹스피어는 그와 같이 OracleResulSet으로 곧바로 캐스팅하는 형식을 지원하지 않습니다.
        NOTE: com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.class는 WAS_HOME/lib/rsadapterspi.jar에 있습니다.

아래 소스로 WASUtil.java 파일을 생성한다.
================================= WASUtil.java =================================
package com.ibm.ws.rsadapter.jdbc;
import com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet;
public class WASUtil {

public static Object getOracleResultSet(java.sql.ResultSet rs){
if(rs instanceof WSJdbcResultSet){
try{
WSJdbcResultSet wrs = (WSJdbcResultSet)rs;
return wrs.getJDBCImplObject();
}
catch(Throwable e){
throw new RuntimeException("WASUtil.getOracleResultSet(rs):" + e.toString());
}
}
else {
String classname = rs.getClass().getName();
if(classname.lastIndexOf("OracleResultSetImpl")>-1 || classname.lastIndexOf("ResultSet4Oracle")>-1 )
return rs;
}
//else
throw new RuntimeException(
"WASUtil.getOracleResultSet(rs) needs olny OracleResultSetImpl " +
"or IBM's WSJdbcResultSet as a parameter");

}
}
================================================================================

그리고, 아래와 같이 CLOB 필드에 값을 입력한다.

conn.setAutoCommit(false);
stmt = conn.createStatement();

// CLOB 필드를 초기화 한다.
sql = "UPDATE "+tableNm+" SET "+clobFld+"=EMPTY_CLOB() WHERE "+whereQuery;
stmt.executeUpdate(sql);
if(stmt!=null){
    stmt.close();
}

// CLOB 필드에 값을 입력한다.
sql = "SELECT "+clobFld+" FROM "+tableNm+" WHERE "+whereQuery+" FOR UPDATE";
rs = stmt.executeQuery(sql);

CLOB clob = null;
if(resultSet.next()){
    //com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet을 OracleResultSet 타입 케스팅 합니다.
    OracleResultSet ors = (OracleResultSet)com.ibm.ws.rsadapter.jdbc.WASUtil.getOracleResultSet(rs);
    clob = ors.getCLOB(1);

    Writer writer = clob.getCharacterOutputStream();
    Reader src = new CharArrayReader(value.toCharArray());
    char[] buffer = new char[1024];
    int read = 0;
    while ( (read = src.read(buffer,0,1024)) != -1){
     writer.write(buffer, 0, read);
    }
    src.close();
    writer.close();
}
conn.sestAutoCommit(true);


NOTE: 그러나, 위처럼 Oracle 종속적인 oracle.sql.CLOB형을 굳이 사용하지 않고 JDBC 10g Driver를 이용하고,
웹스피어 5.x를 사용하시면 JDBC 2.0 표준인 java.sql.Clob을 이용해 동일한 작업을 할 수 있습니다.


[바로가기 링크] : http://coolx.net/cboard/develop/514



Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog