다음은 ResultSet에서 clob컬럼을 select하는 예이다.
//이전 생략(일반적인 SELECT)
String selectQuery = "SELECT CONTENT FROM CLOB_TABLE WHERE IDX = ?";
pstmt = conn.prepareStatement(selectQuery)
pstmt.setInt( 1, request.getParameter("idx") );
rs = pstmt.executeQuery();
//이전 생략(PL/SQL 패키지의 호출. 앞절의 강의 참조...)//
cstmt = con.prepareCall("BEGIN ? := PKG_CLOB_TABLE.SELECT_CLOB(?, ?, ?); END;");
cstmt.registerOutParameter(i++, OracleTypes.CURSOR);
cstmt.setString(i++, userid);
cstmt.registerOutParameter(i, Types.VARCHAR);
cstmt.executeQuery();
ResultSet rs = (ResultSet)cstmt.getObject(1);
String errMsg = cstmt.getString(3); // PL/SQL수행중 예외발생시...
clob의 select를 모듈화 함으로써 반복적인 코딩을 줄일수 있다.
public static Map rsToMap(ResultSet rs){
Reader rd = null;
StringBuffer sb = null;
Map ret = null;
ResultSetMetaData rsmd = null;
int cols = 0;
try{
rsmd = rs.getMetaData();
cols = rsmd.getColumnCount();
ret = new HashMap();
if (rs.next()) {
for(int i=1; i<=cols; i++){
if(rsmd.getColumnTypeName(i).equals("CLOB")){ //CLOB컬럼일경우
rd = rs.getCharacterStream(rsmd.getColumnName(i));
sb = new StringBuffer();
char[] buff = new char[1024];
int read = 0;
try{
while((cnt = rd.read(buff, 0, 1024)) != -1) {
sb.append(buff, 0, read);
}
}catch (NullPointerException e){
continue;
}
rd.close();
ret.put( rsmd.getColumnName(i), sb.toString() );
sb = null;
}else{
ret.put( rsmd.getColumnName(i), rs.getString( rsmd.getColumnName(i)) ) );
}
}
}
rs.close();
}catch (SQLException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return ret;
}
인자로 ResultSet을 주고 Map를 리턴받는다.
if(rs.next(){
StringBuffer content = new StringBuffer();
Reader reader = rs.getCharacterStream(1);
cahr[] buffer = new char[1024];
int read = 0;
while( (read=reader.read(buffer, 0, 1024) ) != -1 ){
content.append(buffer, 0, read);
}
reader.close();
}
결론적으로 위의 부분이 아래처럼 바뀌었다.
Map map = rsToMap(rs);
String content = map.get("content");
댓글 없음:
댓글 쓰기