http://www.daesangit.com/ditboard/board/read.cgi?board=oralib&y_number=52&nnew=2


   ▒   자료실   ▒    

 이름 관리자 
 등록일 2002/9/21(토) 20:49 
 
 서블렛 + JDBC 연동시 코딩 고려사항 ⑦   
Nested SQL Query Issue
아래와 같은 코딩을 생각해보자. 

Connection conn = null;
Statement stmt = null;
try{
conn = ......;
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select deptno ...where id ='"+ id +"'");
while(rs.next()){
String deptno = rs.getString("deptno");
stmt.executeUpdate(
"update set dept_name = ... where deptno = '"+ deptno +"'"
);
......
}
rs.close();
}
catch(Exception e){
....
}
finally {
if ( stmt != null ) try{stmt.close();}catch(Exception e){}
if ( conn != null ) ......;
}

위의 코드는 실행하자마자 다음과 같은 에러가 나타난다. 

DB2 : -99999: [IBM][CLI Driver] CLI0115E 커서 상태가 유효하지 않습니다. 
SQLSTATE=24000 
Oracle : 

에러는 두번째 while(rs.next())시에 발생한다. 왜냐하면 Statement가 nested하게 실행된 executeUpdate()에 의해 엎어쳐 버렸기 때문. ResultSet은 Statement와 밀접하게 관련이 있습다. ResultSet은 자료를 저장하고 있는 객체가 아니라 Interface일 뿐이기 때문이다. 위 코드는 다음처럼 변경돼야 한다. 

Connection conn = null;
Statement stmt1 = null;
Statement stmt2 = null;
try{
conn = ......;
stmt1 = conn.createStatement();
stmt2 = conn.createStatement();
ResultSet rs = stmt1.executeQuery("select deptno ...where id ='"+ id +"'");
while(rs.next()){
String deptno = rs.getString("deptno");
stmt2.executeUpdate(
"update set dept_name = ... where deptno = '"+ deptno +"'"
);
......
}
rs.close();
}
catch(Exception e){
....
}
finally {
if ( stmt1 != null ) try{stmt1.close();}catch(Exception e){}
if ( stmt2 != null ) try{stmt2.close();}catch(Exception e){}
if ( conn != null ) ......;
}

즉 ResultSet에 대한 fetch 작업이 아직 남아 있는 상태에서 관련된 Statement를 또다시 executeQuery()/executeUpdate()하면 안된다.

IBM WebSphere 환경일 경우, 아래의 글도 확인해보면 유용하다. @

349 Re: Function sequence error (Version 3.x)
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=991154615
486 WAS4.0x: Function sequence error 해결 
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=1015345459
