2014년 1월 9일 목요일

CLOB의 SELECT[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

CLOB의 SELECT[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

다음은 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");
 





댓글 없음:

댓글 쓰기