[ java ] in KIDS 글 쓴 이(By): hell (나누구야) 날 짜 (Date): 1997년12월28일(일) 09시39분08초 ROK 제 목(Title): [JDBC] Getting Started 한글판 (4-2) 4.1.3 Execute 메쏘드 사용하기 execute 메쏘드는 SQL문이 여러개의 ResultSet 객체나 여러개의 갱신 카운트 또는 Result 객체들과 갱신 카운트들의 결합을 리턴하는 것이 가능할 때만 사용되어져야 한다. 이러한 결과들의 다중 가능성은 비록 드물지만, 어떠한 저장 프로시져를 실행하거나 알 수 없는 SQL 스트링(즉, 컴파일때에 어플리케이션 프로그래머가 알수 없는)을 동적으로 실행할 때 나타날 수 있다. 예를 들어, 사용자가 CallableStatement 객체(7장의 "CallableStatsment를 찹조)를 사용하여 저장 프로시져를 실행하고, 그런 저장된 프로시져가 갱신(update)하고, 그런다음 선택(select)하고, 그 다음에 갱신(update), 그런다음 다시 선택(select) 등을 수행할 수 있다. 전형적으로 저장 프로시져를 사용하는 사람은 무엇이 리턴되는지를 알 것이다. execute 메쏘드는 평범하지 않은 경우들을 처리하기 때문에, 결과들을 검색하는 것이 몇가지의 특별한 처리를 요구한다는 것은 당연하다. 예를 들어, 프로시져가 두 개의 result set을 리턴한다고 알고 있다고 가정하자. 프로시져를 실행하기위해서 execute 메쏘드를 사용한 후에, 첫 번째 result set을 얻기위해서 getResultSet 메쏘드와 그것으로부터 값을 검색하기위해서 적당한 getXXX 메쏘드를 호출해야만 한다. 두 번째 result set을 얻기 위해서는, getMoreResults와 두 번째 getResultSet 메쏘드를 호출할 필요가 있다. 만약 프로시져가 갱신 카운트를 리턴한다면, getUpdateCount 메쏘드를 호출한다. 리턴되어질 것이 무엇인지 알지 못하는 경우에는 더욱 복잡해진다. execute 메쏘드는 결과가 ResultSet 객체이면 true, 자바 int 이면 false를 리턴한다. 만약 int를 리턴하면, 이것은 결과가 갱신카운트이거나 실행된 SQL문이 DDL 명령이라는 것을 의미한다. execute 메쏘드를 호출한 후에 해야할 첫 번째 일은 getResultSet 이나 getUpdateCount 중 하나를 호출하는 것이다. getResultSet 메쏘드는 두 개이상의 ResultSet 객체들중 첫 번째인 것을 얻기위해서 호출되어진다. 그리고 getUpdateCount 메쏘드는 두 개이상의 갱신 카운트중 첫 번째인 것을 얻기 위해서 호출되어진다. SQL문의 결과가 result set이 아닐 때, getResultSet 메쏘드는 null을 리턴할 것이다. 이것은 결과가 갱신 카운트이거나 더 이상의 결과들이 없음을 의미할 수 있다. 이러한 경우에서 null이 정말로 무엇을 의미하는지 알기위한 유일한 방법은 정수를 리턴하는 getUpdateCount 메쏘드를 호출하는 것이다. 이 정수는 결과가 result set인지 결과가 없는지를 가리키는 호출문에 의해 영향받는 열들의 번호나 -1이 될 것이다. 만약 getResultSet 메쏘드가 이미 null을 리턴했다면, 이것은 결과가 ResultSet 객체가 아님을 의미하고, 그러다음 -1의 리턴값은 더 이상의 결과가 없다는 것을 의미해야만 한다. 바꾸어 말하면, 다음이 true일 때는 (더 이상의) 결과가 없다: ((stmt.getResultSet() == null) && (stmt.getUpdateCount()) == -1) 만약 getResultSet 메쏘드를 로드하고 그것이 리턴한 ResultSet객체를 처리한다면, 다른 result set 이나 갱신 카운트가 있는기 보기위해서 getMoreResults 메쏘드를 호출할 필요가 있다. getMoreResults가 true를 리턴한다면, 실제로 다음 result set을 검색하기위해서 getResultSet 메쏘드를 다시 호출할 필요가 있다. 이미 위에서 언급한것처럼, 만약 getResult이 null을 리턴한다면, null이 결과가 갱신카운트인 것을 의미하는지 또는 더 이상의 결과가 없다는 것을 의미하는를 알기위해서 getUpdateCount 메쏘드를 호출해야만 한다. getMoreResults가 false를 리턴할 때, SQL문이 갱신 카운트를 리턴하거나 더 이상의 결과가 없다는 것을 의미한다. 그래서 경우를 발견하기 위해서 getUpdateCount 메쏘드를 호출할 필요가 있다. 이러한 상황에서, 다음이 true이면 더 이상의 결과는 없다.: ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1)) 아래에 있는 코드는 execute 메쏘드를 호출함으로 생성되는 모든 result set과 갱신 카운트를 접근하는 것을 확인할 수 있는 한가지 방법을 설명한다.: stmt.execute(queryStringWithUnknownResults); while (true) { int rowCount = stmt.getUpdateCount(); if (rowCount > 0) { // This is an update count System.out.println("Rows changed = " + count); stmt.getMoreResults(); continue; } if (rowCount = 0) { // DDL command or 0 updates System.out.println("No rows changed or statement was DDL command"); stmt.getMoreResults(); continue; } // if we have gotten this far, we have either a result set // or no more result. ResultSet rs = stmt.getResultSet; if (rs != null) { ... // use metadata to get info about result set columns while (rs.next()) { ... // process results stmt.getMoreResults(); continue; } break; // there are no more results } ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~ KAIST전기및전자공학과학부96김태홍 URL :: http://volt.kaist.ac.kr/~dodo dodo@ohm dodo@csqueen dodo96@nownuri hell@kids nextism@ara ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~~ ~~moom~ |