Author: cbegin
Date: Sun Aug 13 02:08:28 2006
New Revision: 431155

URL: http://svn.apache.org/viewvc?rev=431155&view=rev
Log:
Multiple ResultSet support complete.  

Modified:
    ibatis/trunk/java/mapper/mapper2/build/build.xml
    ibatis/trunk/java/mapper/mapper2/build/version.properties
    ibatis/trunk/java/mapper/mapper2/doc/release.txt
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
    
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java

Modified: ibatis/trunk/java/mapper/mapper2/build/build.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/build.xml?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/build/build.xml (original)
+++ ibatis/trunk/java/mapper/mapper2/build/build.xml Sun Aug 13 02:08:28 2006
@@ -26,6 +26,7 @@
   <target name="clean">
     <delete dir="${deploy.path}"/>
     <delete dir="${work.root}"/>
+    <delete dir="ibderby"/>
     <delete dir="${reports.root}"/>
     <delete>
       <fileset dir="./">

Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/version.properties?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/build/version.properties (original)
+++ ibatis/trunk/java/mapper/mapper2/build/version.properties Sun Aug 13 
02:08:28 2006
@@ -1,5 +1,5 @@
 #Build version info
-#Wed Aug 02 15:24:03 CDT 2006
+#Sun Aug 13 02:50:18 MDT 2006
 version=2.1.7
-buildDate=2006/08/02 15\:24
-buildNum=618
+buildDate=2006/08/13 02\:50
+buildNum=624

Modified: ibatis/trunk/java/mapper/mapper2/doc/release.txt
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/doc/release.txt?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/doc/release.txt (original)
+++ ibatis/trunk/java/mapper/mapper2/doc/release.txt Sun Aug 13 02:08:28 2006
@@ -9,6 +9,7 @@
  o Removed deprectated JtaDaoTemplate
  o Removed custom nested transactions (JDBC 1.4 now required)
  o Added support for ResultSet OUT params from stored procs (e.g. Oracle Ref 
Cursor)
+ o Added support for Multiple ResultSets mapped to corresponding ResultMaps or 
ResultClasses.
 
  o Fixed IBATIS-224 - isNotNull node causes typehandler mappings in statement 
to fail
  o Fixed IBATIS-249 - Race conditions in Throttle lead to thread blockage 
popping items from ThrottledPools under stress

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlStatementParser.java
 Sun Aug 13 02:08:28 2006
@@ -1,17 +1,7 @@
 package com.ibatis.sqlmap.engine.builder.xml;
 
-import java.sql.ResultSet;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
 import com.ibatis.common.beans.Probe;
 import com.ibatis.common.beans.ProbeFactory;
-
 import com.ibatis.common.resources.Resources;
 import com.ibatis.common.xml.NodeletUtils;
 import com.ibatis.sqlmap.client.SqlMapException;
@@ -24,18 +14,16 @@
 import com.ibatis.sqlmap.engine.mapping.sql.Sql;
 import com.ibatis.sqlmap.engine.mapping.sql.SqlText;
 import com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.DynamicParent;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.IterateTagHandler;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTag;
-import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTagHandler;
-import 
com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTagHandlerFactory;
+import com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.*;
 import com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql;
 import com.ibatis.sqlmap.engine.mapping.sql.stat.StaticSql;
-import com.ibatis.sqlmap.engine.mapping.statement.CachingStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.InsertStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
-import com.ibatis.sqlmap.engine.mapping.statement.SelectKeyStatement;
+import com.ibatis.sqlmap.engine.mapping.statement.*;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.sql.ResultSet;
+import java.util.*;
 
 public class SqlStatementParser extends BaseParser {
 
@@ -60,7 +48,7 @@
 
     String parameterMapName = 
applyNamespace(attributes.getProperty("parameterMap"));
     String parameterClassName = attributes.getProperty("parameterClass");
-    String resultMapName = applyNamespace(attributes.getProperty("resultMap"));
+    String resultMapName = attributes.getProperty("resultMap");
     String resultClassName = attributes.getProperty("resultClass");
     String cacheModelName = 
applyNamespace(attributes.getProperty("cacheModel"));
     String xmlResultName = attributes.getProperty("xmlResultName");
@@ -69,31 +57,32 @@
     String allowRemapping = attributes.getProperty("remapResults");
     String timeout = attributes.getProperty("timeout");
 
-    vars.errorCtx.setObjectId(id + " statement");
+    String[] additionalResultMapNames;
+    List additionalResultMaps = new ArrayList();
 
-    parameterClassName = 
vars.typeHandlerFactory.resolveAlias(parameterClassName);
-    resultClassName = vars.typeHandlerFactory.resolveAlias(resultClassName);
+    vars.errorCtx.setObjectId(id + " statement");
 
-    Class parameterClass = null;
-    Class resultClass = null;
 
     // get parameter and result maps
 
     vars.errorCtx.setMoreInfo("Check the result map name.");
-    BasicResultMap resultMap = null;
+    //BasicResultMap resultMap = null;
     if (resultMapName != null) {
-      resultMap = (BasicResultMap) 
vars.client.getDelegate().getResultMap(resultMapName);
+      additionalResultMapNames = getAllButFirstToken(resultMapName);
+      resultMapName = getFirstToken (resultMapName);
+      statement.setResultMap((BasicResultMap) 
vars.client.getDelegate().getResultMap(applyNamespace(resultMapName)));
+      for (int i=0; i < additionalResultMapNames.length; i++) {
+        statement.addResultMap((BasicResultMap) 
vars.client.getDelegate().getResultMap(applyNamespace(additionalResultMapNames[i])));
+      }
     }
 
     vars.errorCtx.setMoreInfo("Check the parameter map name.");
-    BasicParameterMap parameterMap = null;
+
     if (parameterMapName != null) {
-      parameterMap = (BasicParameterMap) 
vars.client.getDelegate().getParameterMap(parameterMapName);
+      statement.setParameterMap((BasicParameterMap) 
vars.client.getDelegate().getParameterMap(parameterMapName));
     }
 
     statement.setId(id);
-    statement.setParameterMap(parameterMap);
-    statement.setResultMap(resultMap);
     statement.setResource(vars.errorCtx.getResource());
 
     if (resultSetType != null) {
@@ -111,11 +100,13 @@
     }
 
     // set parameter class either from attribute or from map (make sure to 
match)
+    ParameterMap parameterMap = statement.getParameterMap();
     if (parameterMap == null) {
       try {
         if (parameterClassName != null) {
           vars.errorCtx.setMoreInfo("Check the parameter class.");
-          parameterClass = Resources.classForName(parameterClassName);
+          parameterClassName = 
vars.typeHandlerFactory.resolveAlias(parameterClassName);
+          Class parameterClass = Resources.classForName(parameterClassName);
           statement.setParameterClass(parameterClass);
         }
       } catch (ClassNotFoundException e) {
@@ -125,32 +116,25 @@
       statement.setParameterClass(parameterMap.getParameterClass());
     }
 
-    try {
-      if (resultClassName != null) {
-        vars.errorCtx.setMoreInfo("Check the result class.");
-        resultClass = Resources.classForName(resultClassName);
-      }
-    } catch (ClassNotFoundException e) {
-      throw new SqlMapException("Error.  Could not set result class.  Cause: " 
+ e, e);
-    }
-
     // process SQL statement, including inline parameter maps
     vars.errorCtx.setMoreInfo("Check the SQL statement.");
     processSqlStatement(node, statement);
 
     // set up either null result map or automatic result mapping
-    if (resultMap == null && resultClass == null) {
+    BasicResultMap resultMap = (BasicResultMap)statement.getResultMap();
+    if (resultMap == null && resultClassName == null) {
       statement.setResultMap(null);
     } else if (resultMap == null) {
-      resultMap = new AutoResultMap(vars.client.getDelegate(), 
"true".equals(allowRemapping));
-      resultMap.setId(statement.getId() + "-AutoResultMap");
-      resultMap.setResultClass(resultClass);
-      resultMap.setXmlName(xmlResultName);
-      resultMap.setResource(statement.getResource());
+      String firstResultClass = getFirstToken(resultClassName);
+      resultMap = buildAutoResultMap(allowRemapping, statement, 
firstResultClass, xmlResultName);
       statement.setResultMap(resultMap);
-
+      String[] additionalResultClasses = getAllButFirstToken(resultClassName);
+      for (int i=0; i<additionalResultClasses.length; i++) {
+        statement.addResultMap(buildAutoResultMap(allowRemapping, statement, 
additionalResultClasses[i],xmlResultName));
+      }
+      
     }
-    
+
     statement.setTimeout(vars.defaultStatementTimeout);
     if (timeout != null) {
       try {
@@ -174,6 +158,43 @@
 
   }
 
+  private BasicResultMap buildAutoResultMap(String allowRemapping, 
GeneralStatement statement, String firstResultClass, String xmlResultName) {
+    BasicResultMap resultMap;
+    resultMap = new AutoResultMap(vars.client.getDelegate(), 
"true".equals(allowRemapping));
+    resultMap.setId(statement.getId() + "-AutoResultMap");
+    resultMap.setResultClass(resolveClass(firstResultClass));
+    resultMap.setXmlName(xmlResultName);
+    resultMap.setResource(statement.getResource());
+    return resultMap;
+  }
+
+  private Class resolveClass(String resultClassName) {
+    try {
+      if (resultClassName != null) {
+        vars.errorCtx.setMoreInfo("Check the result class.");
+        return 
Resources.classForName(vars.typeHandlerFactory.resolveAlias(resultClassName));
+      } else {
+        return null;
+      }
+    } catch (ClassNotFoundException e) {
+      throw new SqlMapException("Error.  Could not set result class.  Cause: " 
+ e, e);
+    }
+  }
+
+  private String getFirstToken (String s) {
+    return new StringTokenizer(s, ", ", false).nextToken();
+  }
+
+  private String[] getAllButFirstToken (String s) {
+    List strings = new ArrayList();
+    StringTokenizer parser = new StringTokenizer(s, ", ", false);
+    parser.nextToken();
+    while (parser.hasMoreTokens()) {
+      strings.add(parser.nextToken());
+    }
+    return (String[]) strings.toArray(new String[strings.size()]);
+  }
+
   private void processSqlStatement(Node n, GeneralStatement statement) {
     vars.errorCtx.setActivity("processing an SQL statement");
 
@@ -252,14 +273,14 @@
           tag.setPrependAttr(attributes.getProperty("prepend"));
           tag.setPropertyAttr(attributes.getProperty("property"));
           
tag.setRemoveFirstPrepend(attributes.getProperty("removeFirstPrepend"));
-          
+
           tag.setOpenAttr(attributes.getProperty("open"));
           tag.setCloseAttr(attributes.getProperty("close"));
 
           
tag.setComparePropertyAttr(attributes.getProperty("compareProperty"));
           tag.setCompareValueAttr(attributes.getProperty("compareValue"));
           tag.setConjunctionAttr(attributes.getProperty("conjunction"));
-          
+
           // an iterate ancestor requires a post parse
 
           if(dynamic instanceof SqlTag) {
@@ -275,7 +296,7 @@
           }
 
           dynamic.addChild(tag);
-          
+
           if (child.hasChildNodes()) {
             isDynamic = parseDynamicTags(child, tag, sqlBuffer, isDynamic, 
tag.isPostParseRequired());
           }
@@ -342,7 +363,7 @@
     selectKeyStatement.setId(insertStatement.getId() + "-SelectKey");
     selectKeyStatement.setResource(vars.errorCtx.getResource());
     selectKeyStatement.setKeyProperty(keyPropName);
-    
+
     // process the type (pre or post) attribute
     boolean hasType;
     String type = attributes.getProperty("type");

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java
 Sun Aug 13 02:08:28 2006
@@ -39,12 +39,10 @@
   //
   // Constants
   //
-
   /**
    * Constant to let us know not to skip anything
    */
   public static final int NO_SKIPPED_RESULTS = 0;
-
   /**
    * Constant to let us know to include all records
    */
@@ -57,57 +55,44 @@
   /**
    * Execute an update
    *
-   * @param request - the request scope
-   * @param conn - the database connection
-   * @param sql - the sql statement to execute
+   * @param request    - the request scope
+   * @param conn       - the database connection
+   * @param sql        - the sql statement to execute
    * @param parameters - the parameters for the sql statement
-   *
    * @return - the number of records changed
-   *
    * @throws SQLException - if the update fails
    */
-  public int executeUpdate(RequestScope request, Connection conn, String sql, 
Object[] parameters)
-      throws SQLException {
+  public int executeUpdate(RequestScope request, Connection conn, String sql, 
Object[] parameters) throws SQLException {
     ErrorContext errorContext = request.getErrorContext();
     errorContext.setActivity("executing update");
     errorContext.setObjectId(sql);
-
     PreparedStatement ps = null;
     int rows = 0;
-
     try {
       errorContext.setMoreInfo("Check the SQL Statement (preparation 
failed).");
       ps = conn.prepareStatement(sql);
-      
       setStatementTimeout(request.getStatement(), ps);
-
       errorContext.setMoreInfo("Check the parameters (set parameters 
failed).");
       request.getParameterMap().setParameters(request, ps, parameters);
-
       errorContext.setMoreInfo("Check the statement (update failed).");
-
       ps.execute();
       rows = ps.getUpdateCount();
-    }
-    finally {
+    } finally {
       closeStatement(ps);
     }
-
     return rows;
   }
 
   /**
    * Adds a statement to a batch
    *
-   * @param request - the request scope
-   * @param conn - the database connection
-   * @param sql - the sql statement
+   * @param request    - the request scope
+   * @param conn       - the database connection
+   * @param sql        - the sql statement
    * @param parameters - the parameters for the statement
-   *
    * @throws SQLException - if the statement fails
    */
-  public void addBatch(RequestScope request, Connection conn, String sql, 
Object[] parameters)
-      throws SQLException {
+  public void addBatch(RequestScope request, Connection conn, String sql, 
Object[] parameters) throws SQLException {
     Batch batch = (Batch) request.getSession().getBatch();
     if (batch == null) {
       batch = new Batch();
@@ -120,13 +105,10 @@
    * Execute a batch of statements
    *
    * @param session - the session scope
-   *
    * @return - the number of rows impacted by the batch
-   *
    * @throws SQLException - if a statement fails
    */
-  public int executeBatch(SessionScope session)
-      throws SQLException {
+  public int executeBatch(SessionScope session) throws SQLException {
     int rows = 0;
     Batch batch = (Batch) session.getBatch();
     if (batch != null) {
@@ -143,16 +125,14 @@
    * Execute a batch of statements
    *
    * @param session - the session scope
-   *
    * @return - a List of BatchResult objects (may be null if no batch
-   *  has been initiated).  There will be one BatchResult object in the
-   *  list for each sub-batch executed
-   * @throws SQLException if a database access error occurs, or the drive
-   *   does not support batch statements
+   *         has been initiated).  There will be one BatchResult object in the
+   *         list for each sub-batch executed
+   * @throws SQLException   if a database access error occurs, or the drive
+   *                        does not support batch statements
    * @throws BatchException if the driver throws BatchUpdateException
    */
-  public List executeBatchDetailed(SessionScope session)
-      throws SQLException, BatchException {
+  public List executeBatchDetailed(SessionScope session) throws SQLException, 
BatchException {
     List answer = null;
     Batch batch = (Batch) session.getBatch();
     if (batch != null) {
@@ -164,63 +144,47 @@
     }
     return answer;
   }
-  
+
   /**
    * Long form of the method to execute a query
    *
-   * @param request - the request scope
-   * @param conn - the database connection
-   * @param sql - the SQL statement to execute
-   * @param parameters - the parameters for the statement
+   * @param request     - the request scope
+   * @param conn        - the database connection
+   * @param sql         - the SQL statement to execute
+   * @param parameters  - the parameters for the statement
    * @param skipResults - the number of results to skip
-   * @param maxResults - the maximum number of results to return
-   * @param callback - the row handler for the query
-   *
+   * @param maxResults  - the maximum number of results to return
+   * @param callback    - the row handler for the query
    * @throws SQLException - if the query fails
    */
-  public void executeQuery(RequestScope request, Connection conn, String sql, 
Object[] parameters,
-                           int skipResults, int maxResults, RowHandlerCallback 
callback)
-      throws SQLException {
+  public void executeQuery(RequestScope request, Connection conn, String sql, 
Object[] parameters, int skipResults, int maxResults, RowHandlerCallback 
callback) throws SQLException {
     ErrorContext errorContext = request.getErrorContext();
     errorContext.setActivity("executing query");
     errorContext.setObjectId(sql);
-
     PreparedStatement ps = null;
     ResultSet rs = null;
-
     try {
       errorContext.setMoreInfo("Check the SQL Statement (preparation 
failed).");
-
       Integer rsType = request.getStatement().getResultSetType();
       if (rsType != null) {
         ps = conn.prepareStatement(sql, rsType.intValue(), 
ResultSet.CONCUR_READ_ONLY);
       } else {
         ps = conn.prepareStatement(sql);
       }
-
       setStatementTimeout(request.getStatement(), ps);
-
       Integer fetchSize = request.getStatement().getFetchSize();
       if (fetchSize != null) {
         ps.setFetchSize(fetchSize.intValue());
       }
-
       errorContext.setMoreInfo("Check the parameters (set parameters 
failed).");
       request.getParameterMap().setParameters(request, ps, parameters);
-
       errorContext.setMoreInfo("Check the statement (query failed).");
-
       ps.execute();
-      rs = getFirstResultSet(ps);
-
-      if (rs != null) {
-        errorContext.setMoreInfo("Check the results (failed to retrieve 
results).");
-        handleResults(request, rs, skipResults, maxResults, callback);
-      }
-
-      // clear out remaining results
-      while (getMoreResults(ps));
+      errorContext.setMoreInfo("Check the results (failed to retrieve 
results).");
 
+      // Begin ResultSet Handling
+      rs = handleMultipleResults(ps, request, skipResults, maxResults, 
callback);
+      // End ResultSet Handling
     } finally {
       try {
         closeResultSet(rs);
@@ -234,113 +198,86 @@
   /**
    * Execute a stored procedure that updates data
    *
-   * @param request - the request scope
-   * @param conn - the database connection
-   * @param sql - the SQL to call the procedure
+   * @param request    - the request scope
+   * @param conn       - the database connection
+   * @param sql        - the SQL to call the procedure
    * @param parameters - the parameters for the procedure
-   *
    * @return - the rows impacted by the procedure
-   *
    * @throws SQLException - if the procedure fails
    */
-  public int executeUpdateProcedure(RequestScope request, Connection conn, 
String sql, Object[] parameters)
-      throws SQLException {
+  public int executeUpdateProcedure(RequestScope request, Connection conn, 
String sql, Object[] parameters) throws SQLException {
     ErrorContext errorContext = request.getErrorContext();
     errorContext.setActivity("executing update procedure");
     errorContext.setObjectId(sql);
-
     CallableStatement cs = null;
     int rows = 0;
-
     try {
       errorContext.setMoreInfo("Check the SQL Statement (preparation 
failed).");
       cs = conn.prepareCall(sql);
-
       setStatementTimeout(request.getStatement(), cs);
-
       ParameterMap parameterMap = request.getParameterMap();
-
       ParameterMapping[] mappings = parameterMap.getParameterMappings();
-
       errorContext.setMoreInfo("Check the output parameters (register output 
parameters failed).");
       registerOutputParameters(cs, mappings);
-
       errorContext.setMoreInfo("Check the parameters (set parameters 
failed).");
       parameterMap.setParameters(request, cs, parameters);
-
       errorContext.setMoreInfo("Check the statement (update procedure 
failed).");
-
       cs.execute();
       rows = cs.getUpdateCount();
-
       errorContext.setMoreInfo("Check the output parameters (retrieval of 
output parameters failed).");
       retrieveOutputParameters(request, cs, mappings, parameters, null);
     } finally {
       closeStatement(cs);
     }
-
     return rows;
   }
 
   /**
    * Execute a stored procedure
    *
-   * @param request - the request scope
-   * @param conn - the database connection
-   * @param sql - the sql to call the procedure
-   * @param parameters - the parameters for the procedure
+   * @param request     - the request scope
+   * @param conn        - the database connection
+   * @param sql         - the sql to call the procedure
+   * @param parameters  - the parameters for the procedure
    * @param skipResults - the number of results to skip
-   * @param maxResults - the maximum number of results to return
-   * @param callback - a row handler for processing the results
-   *
+   * @param maxResults  - the maximum number of results to return
+   * @param callback    - a row handler for processing the results
    * @throws SQLException - if the procedure fails
    */
-  public void executeQueryProcedure(RequestScope request, Connection conn, 
String sql, Object[] parameters,
-                                    int skipResults, int maxResults, 
RowHandlerCallback callback)
-      throws SQLException {
+  public void executeQueryProcedure(RequestScope request, Connection conn, 
String sql, Object[] parameters, int skipResults, int maxResults, 
RowHandlerCallback callback) throws SQLException {
     ErrorContext errorContext = request.getErrorContext();
     errorContext.setActivity("executing query procedure");
     errorContext.setObjectId(sql);
-
     CallableStatement cs = null;
     ResultSet rs = null;
-
     try {
       errorContext.setMoreInfo("Check the SQL Statement (preparation 
failed).");
-      cs = conn.prepareCall(sql);
-
+      Integer rsType = request.getStatement().getResultSetType();
+      if (rsType != null) {
+        cs = conn.prepareCall(sql, rsType.intValue(), 
ResultSet.CONCUR_READ_ONLY);
+      } else {
+        cs = conn.prepareCall(sql);
+      }
       setStatementTimeout(request.getStatement(), cs);
-
       Integer fetchSize = request.getStatement().getFetchSize();
       if (fetchSize != null) {
         cs.setFetchSize(fetchSize.intValue());
       }
-      
       ParameterMap parameterMap = request.getParameterMap();
-
       ParameterMapping[] mappings = parameterMap.getParameterMappings();
-
       errorContext.setMoreInfo("Check the output parameters (register output 
parameters failed).");
       registerOutputParameters(cs, mappings);
-
       errorContext.setMoreInfo("Check the parameters (set parameters 
failed).");
       parameterMap.setParameters(request, cs, parameters);
-
       errorContext.setMoreInfo("Check the statement (update procedure 
failed).");
-
       cs.execute();
-      rs = getFirstResultSet(cs);
-
-      if (rs != null) {
-        errorContext.setMoreInfo("Check the results (failed to retrieve 
results).");
-        handleResults(request, rs, skipResults, maxResults, callback);
-      }
-
-      // consume additional results
-      while (getMoreResults(cs));
+      errorContext.setMoreInfo("Check the results (failed to retrieve 
results).");
 
+      // Begin ResultSet Handling
+      rs = handleMultipleResults(cs, request, skipResults, maxResults, 
callback);
+      // End ResultSet Handling
       errorContext.setMoreInfo("Check the output parameters (retrieval of 
output parameters failed).");
-      retrieveOutputParameters( request, cs, mappings, parameters, callback);
+      retrieveOutputParameters(request, cs, mappings, parameters, callback);
 
     } finally {
       try {
@@ -349,7 +286,42 @@
         closeStatement(cs);
       }
     }
+  }
+
+  private ResultSet handleMultipleResults(PreparedStatement ps, RequestScope 
request, int skipResults, int maxResults, RowHandlerCallback callback) throws 
SQLException {
+    ResultSet rs;
+    rs = getFirstResultSet(ps);
+    if (rs != null) {
+      handleResults(request, rs, skipResults, maxResults, callback);
+    }
 
+    // Multiple ResultSet handling
+    if (callback.getRowHandler() instanceof DefaultRowHandler) {
+      MappedStatement statement = request.getStatement();
+      DefaultRowHandler defaultRowHandler = ((DefaultRowHandler) 
callback.getRowHandler());
+      if (statement.hasMultipleResultMaps()) {
+        List multipleResults = new ArrayList();
+        multipleResults.add(defaultRowHandler.getList());
+        ResultMap[] resultMaps = statement.getAdditionalResultMaps();
+        int i = 0;
+        while (moveToNextResultsSafely(ps)) {
+          if (i >= resultMaps.length) break;
+          ResultMap rm = resultMaps[i];
+          request.setResultMap(rm);
+          rs = ps.getResultSet();
+          DefaultRowHandler rh = new DefaultRowHandler();
+          handleResults(request, rs, skipResults, maxResults, new 
RowHandlerCallback(rm, null, rh));
+          multipleResults.add(rh.getList());
+          i++;
+        }
+        defaultRowHandler.setList(multipleResults);
+        request.setResultMap(statement.getResultMap());
+      } else {
+        while (moveToNextResultsSafely(ps)) ;
+      }
+    }
+    // End additional ResultSet handling
+    return rs;
   }
 
   private ResultSet getFirstResultSet(Statement stmt) throws SQLException {
@@ -360,62 +332,78 @@
       if (rs != null) {
         break;
       }
-      hasMoreResults = moveToNextResultSet(stmt);
+      hasMoreResults = moveToNextResultsIfPresent(stmt);
     }
     return rs;
   }
 
-  private boolean moveToNextResultSet(Statement stmt) throws SQLException {
+  private boolean moveToNextResultsIfPresent(Statement stmt) throws 
SQLException {
     boolean moreResults;
     // This is the messed up JDBC approach for determining if there are more 
results
-    moreResults = !(((getMoreResults(stmt) == false) && (stmt.getUpdateCount() 
== -1)));
+    moreResults = !(((moveToNextResultsSafely(stmt) == false) && 
(stmt.getUpdateCount() == -1)));
     return moreResults;
   }
 
-  /**
-   * Clean up any batches on the session
-   *
-   * @param session - the session to clean up
-   */
-  public void cleanup(SessionScope session) {
-    Batch batch = (Batch) session.getBatch();
-    if (batch != null) {
-      batch.cleanupBatch();
-      session.setBatch(null);
-    }
-  }
-
-  private boolean getMoreResults(Statement stmt) throws SQLException {
+  private boolean moveToNextResultsSafely(Statement stmt) throws SQLException {
     if (!stmt.getConnection().getMetaData().supportsMultipleResultSets()) {
       return false;
     }
     return stmt.getMoreResults();
   }
 
+  private void handleResults(RequestScope request, ResultSet rs, int 
skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
+    try {
+      request.setResultSet(rs);
+      ResultMap resultMap = request.getResultMap();
+      if (resultMap != null) {
+        // Skip Results
+        if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
+          if (skipResults > 0) {
+            rs.absolute(skipResults);
+          }
+        } else {
+          for (int i = 0; i < skipResults; i++) {
+            if (!rs.next()) {
+              return;
+            }
+          }
+        }
+
+        // Get Results
+        int resultsFetched = 0;
+        while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched 
< maxResults) && rs.next()) {
+          Object[] columnValues = resultMap.resolveSubMap(request, 
rs).getResults(request, rs);
+          callback.handleResultObject(request, columnValues, rs);
+          resultsFetched++;
+        }
+      }
+    } finally {
+      request.setResultSet(null);
+    }
+  }
+
   private void retrieveOutputParameters(RequestScope request, 
CallableStatement cs, ParameterMapping[] mappings, Object[] parameters, 
RowHandlerCallback callback) throws SQLException {
     for (int i = 0; i < mappings.length; i++) {
       BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]);
       if (mapping.isOutputAllowed()) {
-               if ( 
"java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName()) )  {
-                 ResultSet rs = (ResultSet) cs.getObject( i + 1 );
-                 ResultMap resultMap;
-                 if ( mapping.getResultMapName() == null ) {
-                        resultMap =  request.getResultMap();
-                        handleResults(request, resultMap, rs, callback);
-                 }
-                 else {
-                        ExtendedSqlMapClient client = 
(ExtendedSqlMapClient)request.getSession().getSqlMapClient();
-                    resultMap =  client.getDelegate().getResultMap( 
mapping.getResultMapName() );
-                    DefaultRowHandler rowHandler = new DefaultRowHandler();
-                    RowHandlerCallback handlerCallback = new 
RowHandlerCallback(resultMap, null, rowHandler);
-                    handleResults(request, resultMap, rs, handlerCallback);
-                    parameters[i] = rowHandler.getList();
-                 }
-                 rs.close();
-         }
-         else {
-              parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1);
-             }
+        if ("java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName())) {
+          ResultSet rs = (ResultSet) cs.getObject(i + 1);
+          ResultMap resultMap;
+          if (mapping.getResultMapName() == null) {
+            resultMap = request.getResultMap();
+            handleOutputParameterResults(request, resultMap, rs, callback);
+          } else {
+            ExtendedSqlMapClient client = (ExtendedSqlMapClient) 
request.getSession().getSqlMapClient();
+            resultMap = 
client.getDelegate().getResultMap(mapping.getResultMapName());
+            DefaultRowHandler rowHandler = new DefaultRowHandler();
+            RowHandlerCallback handlerCallback = new 
RowHandlerCallback(resultMap, null, rowHandler);
+            handleOutputParameterResults(request, resultMap, rs, 
handlerCallback);
+            parameters[i] = rowHandler.getList();
+          }
+          rs.close();
+        } else {
+          parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1);
+        }
       }
     }
   }
@@ -424,11 +412,11 @@
     for (int i = 0; i < mappings.length; i++) {
       BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]);
       if (mapping.isOutputAllowed()) {
-        if ( null != mapping.getTypeName() && 
!mapping.getTypeName().equals("") ) { //@added
-          cs.registerOutParameter(i + 1, mapping.getJdbcType(), 
mapping.getTypeName() );
+        if (null != mapping.getTypeName() && 
!mapping.getTypeName().equals("")) { //@added
+          cs.registerOutParameter(i + 1, mapping.getJdbcType(), 
mapping.getTypeName());
         } else {
-          if (mapping.getNumericScale() != null
-              && (mapping.getJdbcType() == Types.NUMERIC || 
mapping.getJdbcType() == Types.DECIMAL)) {
+          if (mapping.getNumericScale() != null && (mapping.getJdbcType() == 
Types.NUMERIC || mapping.getJdbcType() == Types.DECIMAL))
+          {
             cs.registerOutParameter(i + 1, mapping.getJdbcType(), 
mapping.getNumericScale().intValue());
           } else {
             cs.registerOutParameter(i + 1, mapping.getJdbcType());
@@ -438,13 +426,12 @@
     }
   }
 
-  private void handleResults(RequestScope request, ResultMap resultMap, 
ResultSet rs, RowHandlerCallback callback) throws SQLException {
-       ResultMap orig = request.getResultMap();
+  private void handleOutputParameterResults(RequestScope request, ResultMap 
resultMap, ResultSet rs, RowHandlerCallback callback) throws SQLException {
+    ResultMap orig = request.getResultMap();
     try {
       request.setResultSet(rs);
       if (resultMap != null) {
-       request.setResultMap( resultMap );
-
+        request.setResultMap(resultMap);
 
         // Get Results
         while (rs.next()) {
@@ -458,34 +445,16 @@
     }
   }
 
-  private void handleResults(RequestScope request, ResultSet rs, int 
skipResults, int maxResults, RowHandlerCallback callback) throws SQLException {
-    try {
-      request.setResultSet(rs);
-      ResultMap resultMap = request.getResultMap();
-      if (resultMap != null) {
-        // Skip Results
-        if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) {
-          if (skipResults > 0) {
-            rs.absolute(skipResults);
-          }
-        } else {
-          for (int i = 0; i < skipResults; i++) {
-            if (!rs.next()) {
-              return;
-            }
-          }
-        }
-
-        // Get Results
-        int resultsFetched = 0;
-        while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched 
< maxResults) && rs.next()) {
-          Object[] columnValues = resultMap.resolveSubMap(request, 
rs).getResults(request, rs);
-          callback.handleResultObject(request, columnValues, rs);
-          resultsFetched++;
-        }
-      }
-    } finally {
-      request.setResultSet(null);
+  /**
+   * Clean up any batches on the session
+   *
+   * @param session - the session to clean up
+   */
+  public void cleanup(SessionScope session) {
+    Batch batch = (Batch) session.getBatch();
+    if (batch != null) {
+      batch.cleanupBatch();
+      session.setBatch(null);
     }
   }
 
@@ -514,9 +483,8 @@
       }
     }
   }
-  
-  private static void setStatementTimeout(MappedStatement mappedStatement,
-      Statement statement) throws SQLException {
+
+  private static void setStatementTimeout(MappedStatement mappedStatement, 
Statement statement) throws SQLException {
     if (mappedStatement.getTimeout() != null) {
       statement.setQueryTimeout(mappedStatement.getTimeout().intValue());
     } else {
@@ -553,25 +521,20 @@
     /**
      * Add a prepared statement to the batch
      *
-     * @param request - the request scope
-     * @param conn - the database connection
-     * @param sql - the SQL to add
+     * @param request    - the request scope
+     * @param conn       - the database connection
+     * @param sql        - the SQL to add
      * @param parameters - the parameters for the SQL
-     *
      * @throws SQLException - if the prepare for the SQL fails
      */
     public void addBatch(RequestScope request, Connection conn, String sql, 
Object[] parameters) throws SQLException {
       PreparedStatement ps = null;
-      if (currentSql != null
-          && sql.hashCode() == currentSql.hashCode()
-          && sql.length() == currentSql.length()) {
+      if (currentSql != null && sql.hashCode() == currentSql.hashCode() && 
sql.length() == currentSql.length()) {
         int last = statementList.size() - 1;
         ps = (PreparedStatement) statementList.get(last);
       } else {
         ps = conn.prepareStatement(sql);
-
         setStatementTimeout(request.getStatement(), ps);
-
         currentSql = sql;
         statementList.add(ps);
         batchResultList.add(new BatchResult(request.getStatement().getId(), 
sql));
@@ -583,13 +546,12 @@
 
     /**
      * TODO (Jeff Butler) - maybe this method should be deprecated in some 
release,
-     *  and then removed in some even later release.  executeBatchDetailed 
gives
-     *  much more complete information.
-     *  
+     * and then removed in some even later release.  executeBatchDetailed gives
+     * much more complete information.
+     * <p/>
      * Execute the current session's batch
      *
      * @return - the number of rows updated
-     *
      * @throws SQLException - if the batch fails
      */
     public int executeBatch() throws SQLException {
@@ -613,17 +575,16 @@
     /**
      * Batch execution method that returns all the information
      * the driver has to offer.
-     * 
+     *
      * @return a List of BatchResult objects
      * @throws BatchException (an SQLException sub class) if any nested
-     *  batch fails
-     * @throws SQLException if a database access error occurs, or the drive
-     *   does not support batch statements
+     *                        batch fails
+     * @throws SQLException   if a database access error occurs, or the drive
+     *                        does not support batch statements
      * @throws BatchException if the driver throws BatchUpdateException
      */
     public List executeBatchDetailed() throws SQLException, BatchException {
       List answer = new ArrayList();
-      
       for (int i = 0, n = statementList.size(); i < n; i++) {
         BatchResult br = (BatchResult) batchResultList.get(i);
         PreparedStatement ps = (PreparedStatement) statementList.get(i);
@@ -639,15 +600,13 @@
             message.append(i);
             message.append(" prior sub batch(s) completed successfully, but 
will be rolled back.");
           }
-          
           throw new BatchException(message.toString(), e, answer, 
br.getStatementId(), br.getSql());
         }
         answer.add(br);
       }
-      
       return answer;
     }
-    
+
     /**
      * Close all the statements in the batch and clear all the statements
      */

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/result/ResultMap.java
 Sun Aug 13 02:08:28 2006
@@ -83,4 +83,5 @@
   public ResultMap resolveSubMap (RequestScope request, ResultSet rs) throws 
SQLException;
 
   public Discriminator getDiscriminator();
+
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/BaseStatement.java
 Sun Aug 13 02:08:28 2006
@@ -26,6 +26,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Arrays;
 
 public abstract class BaseStatement implements MappedStatement {
 
@@ -39,6 +40,7 @@
   private int baseCacheKey;
   private ExtendedSqlMapClient sqlMapClient;
   private Integer timeout;
+  private ResultMap[] additionalResultMaps = new ResultMap[0];
 
   private List executeListeners = new ArrayList();
 
@@ -158,5 +160,21 @@
   public void setTimeout(Integer timeout) {
     this.timeout = timeout;
   }
+
+  public void addResultMap(ResultMap resultMap) {
+    List resultMapList = Arrays.asList(additionalResultMaps);
+    resultMapList = new ArrayList(resultMapList);
+    resultMapList.add(resultMap);
+    additionalResultMaps = (ResultMap[])resultMapList.toArray(new 
ResultMap[resultMapList.size()]);
+  }
+
+  public boolean hasMultipleResultMaps() {
+    return additionalResultMaps.length > 0;
+  }
+
+  public ResultMap[] getAdditionalResultMaps() {
+    return additionalResultMaps;
+  }
+
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/CachingStatement.java
 Sun Aug 13 02:08:28 2006
@@ -143,4 +143,12 @@
     return statement.getTimeout();
   }
 
+  public boolean hasMultipleResultMaps() {
+    return statement.hasMultipleResultMaps();
+  }
+
+  public ResultMap[] getAdditionalResultMaps() {
+    return statement.getAdditionalResultMaps();
+  }
+
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/DefaultRowHandler.java
 Sun Aug 13 02:08:28 2006
@@ -32,4 +32,8 @@
     return list;
   }
 
+  public void setList(List list) {
+    this.list = list;
+  }
+
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/MappedStatement.java
 Sun Aug 13 02:08:28 2006
@@ -68,4 +68,8 @@
 
   public Integer getTimeout();
 
+  public boolean hasMultipleResultMaps();
+
+  public ResultMap[] getAdditionalResultMaps();
+
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/statement/RowHandlerCallback.java
 Sun Aug 13 02:08:28 2006
@@ -98,5 +98,8 @@
     return s;
   }
 
+  public RowHandler getRowHandler() {
+    return rowHandler;
+  }
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java 
(original)
+++ 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/MultiResultSetTest.java 
Sun Aug 13 02:08:28 2006
@@ -5,6 +5,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.sql.Connection;
+import java.sql.CallableStatement;
+import java.sql.ResultSet;
 
 public class MultiResultSetTest extends BaseSqlMapTest {
 
@@ -17,22 +20,49 @@
 
   }
 
-  /**
-   * This test should return 2 lists of 2 accounts each
-   */
-  public void testShouldRetrieveTwoSetsOfTwoAccountsFromMultipleResultSets() {
+  public void testShouldRetrieveTwoSetsOfTwoAccountsFromMultipleResultMaps() 
throws Exception {
     Map persons = new HashMap();
-    persons.put("accountId1", new Integer(1));
-    persons.put("accountId2", new Integer(2));
-    persons.put("accountId3", new Integer(3));
-    persons.put("accountId4", new Integer(4));
-    try {
-      List results = sqlMap.queryForList("getMultiListsRm", persons);
-      assertEquals(2, results.size());
+    persons.put("1", new Integer(1));
+    persons.put("2", new Integer(2));
+    persons.put("3", new Integer(3));
+    persons.put("4", new Integer(4));
+    List results = sqlMap.queryForList("getMultiListsRm", persons);
+    assertEquals(2, results.size());
+    assertEquals(2, ((List) results.get(0)).size());
+    assertEquals(2, ((List) results.get(1)).size());
+  }
+
+  public void 
testShouldRetrieveTwoSetsOfTwoAccountsFromMultipleResultClasses() throws 
Exception {
+    Map persons = new HashMap();
+    persons.put("1", new Integer(1));
+    persons.put("2", new Integer(2));
+    persons.put("3", new Integer(3));
+    persons.put("4", new Integer(4));
+    List results = sqlMap.queryForList("getMultiListsRc", persons);
+    assertEquals(2, results.size());
+    assertEquals(2, ((List) results.get(0)).size());
+    assertEquals(2, ((List) results.get(1)).size());
+  }
 
-    } catch (Exception e) {
-      fail(e.getMessage());
+  public void testCallableStatementShouldReturnTwoResultSets() throws 
Exception {
+    sqlMap.startTransaction();
+    Connection conn = sqlMap.getCurrentConnection();
+    CallableStatement cs = conn.prepareCall("{call MRESULTSET(?,?,?,?)}");
+    cs.setInt(1, 1);
+    cs.setInt(2, 2);
+    cs.setInt(3, 3);
+    cs.setInt(4, 4);
+    cs.execute();
+    ResultSet rs = cs.getResultSet();
+    assertNotNull(rs);
+    int found = 1;
+    while (cs.getMoreResults()) {
+      assertNotNull(cs.getResultSet());
+      found++;
     }
+    rs.close();
+    cs.close();
+    assertEquals("Didn't find second result set.", 2, found);
   }
 
 

Modified: 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml 
(original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DerbyProc.xml 
Sun Aug 13 02:08:28 2006
@@ -7,13 +7,6 @@
 <sqlMap namespace="DerbyProc">
 
   <typeAlias alias="account" type="testdomain.Account"/>
-
-  <parameterMap id="multiList" class="map" >
-    <parameter property="accountId1" jdbcType="INTEGER" 
javaType="java.lang.Integer" mode="IN"/>
-    <parameter property="accountId2" jdbcType="INTEGER" 
javaType="java.lang.Integer" mode="IN"/>
-    <parameter property="accountId3" jdbcType="INTEGER" 
javaType="java.lang.Integer" mode="IN"/>
-    <parameter property="accountId4" jdbcType="INTEGER" 
javaType="java.lang.Integer" mode="IN"/>
-  </parameterMap>
   
   <resultMap id="account-result" class="account">
     <result property="id" column="ACC_ID" columnIndex="1"/>
@@ -24,11 +17,11 @@
   <!-- <parameter property="accountList" javaType="list" mode="OUT"/> -->
   <!-- <parameter property="accountList" javaType="list" mode="OUT"/> -->
   
-  <procedure id="getMultiListsRm" parameterMap="multiList" 
resultMap="account-result">
-     {call MRESULTSET(?,?,?,?)}
+  <procedure id="getMultiListsRm" parameterClass="hashmap" 
resultMap="account-result, account-result">
+     {call MRESULTSET(#1#,#2#,#3#,#4#)}
   </procedure>
   
-  <procedure id="getMultiListsRc" parameterMap="multiList" 
resultClass="account">
-     {call MRESULTSET(?,?,?,?)}
+  <procedure id="getMultiListsRc" parameterClass="hashmap" 
resultClass="account, account">
+    {call MRESULTSET(#1#,#2#,#3#,#4#)}
   </procedure>
 </sqlMap>

Modified: 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java?rev=431155&r1=431154&r2=431155&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java 
(original)
+++ 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/proc/DerbyProcs.java 
Sun Aug 13 02:08:28 2006
@@ -16,7 +16,7 @@
     PreparedStatement ps2 = conn.prepareStatement("select * from account where 
acc_id in (?,?)");
     ps2.setInt(1, p3);
     ps2.setInt(2, p4);
-    rs1[0] = ps2.executeQuery();
+    rs2[0] = ps2.executeQuery();
     conn.close();
   }
 


Reply via email to