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 |
|
|
|
[Modify] [Delete] | [Reply] [List] |