提交 3ff3805e 编写于 作者: J Juergen Hoeller

Fixed extractOutputParameters to properly extract ResultSet in all cases

Issue: SPR-11076
上级 ccafccbe
......@@ -35,7 +35,6 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.dao.DataAccessException;
......@@ -1199,28 +1198,29 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
* @param resultSetParameters Parameter list of declared resultSet parameters for the stored procedure
* @return Map that contains returned results
*/
@SuppressWarnings("rawtypes")
protected Map<String, Object> extractReturnedResults(
CallableStatement cs, List updateCountParameters, List resultSetParameters, int updateCount)
protected Map<String, Object> extractReturnedResults(CallableStatement cs,
List<SqlParameter> updateCountParameters, List<SqlParameter> resultSetParameters, int updateCount)
throws SQLException {
Map<String, Object> returnedResults = new HashMap<String, Object>();
int rsIndex = 0;
int updateIndex = 0;
boolean moreResults;
if (!skipResultsProcessing) {
if (!this.skipResultsProcessing) {
do {
if (updateCount == -1) {
if (resultSetParameters != null && resultSetParameters.size() > rsIndex) {
SqlReturnResultSet declaredRsParam = (SqlReturnResultSet)resultSetParameters.get(rsIndex);
SqlReturnResultSet declaredRsParam = (SqlReturnResultSet) resultSetParameters.get(rsIndex);
returnedResults.putAll(processResultSet(cs.getResultSet(), declaredRsParam));
rsIndex++;
}
else {
if (!skipUndeclaredResults) {
if (!this.skipUndeclaredResults) {
String rsName = RETURN_RESULT_SET_PREFIX + (rsIndex + 1);
SqlReturnResultSet undeclaredRsParam = new SqlReturnResultSet(rsName, new ColumnMapRowMapper());
logger.info("Added default SqlReturnResultSet parameter named " + rsName);
if (logger.isDebugEnabled()) {
logger.debug("Added default SqlReturnResultSet parameter named '" + rsName + "'");
}
returnedResults.putAll(processResultSet(cs.getResultSet(), undeclaredRsParam));
rsIndex++;
}
......@@ -1228,16 +1228,18 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
}
else {
if (updateCountParameters != null && updateCountParameters.size() > updateIndex) {
SqlReturnUpdateCount ucParam = (SqlReturnUpdateCount)updateCountParameters.get(updateIndex);
SqlReturnUpdateCount ucParam = (SqlReturnUpdateCount) updateCountParameters.get(updateIndex);
String declaredUcName = ucParam.getName();
returnedResults.put(declaredUcName, updateCount);
updateIndex++;
}
else {
if (!skipUndeclaredResults) {
String undeclaredUcName = RETURN_UPDATE_COUNT_PREFIX + (updateIndex + 1);
logger.info("Added default SqlReturnUpdateCount parameter named " + undeclaredUcName);
returnedResults.put(undeclaredUcName, updateCount);
if (!this.skipUndeclaredResults) {
String undeclaredName = RETURN_UPDATE_COUNT_PREFIX + (updateIndex + 1);
if (logger.isDebugEnabled()) {
logger.debug("Added default SqlReturnUpdateCount parameter named '" + undeclaredName + "'");
}
returnedResults.put(undeclaredName, updateCount);
updateIndex++;
}
}
......@@ -1281,8 +1283,10 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
else {
String rsName = outParam.getName();
SqlReturnResultSet rsParam = new SqlReturnResultSet(rsName, new ColumnMapRowMapper());
returnedResults.putAll(processResultSet(cs.getResultSet(), rsParam));
logger.info("Added default SqlReturnResultSet parameter named " + rsName);
returnedResults.putAll(processResultSet((ResultSet) out, rsParam));
if (logger.isDebugEnabled()) {
logger.debug("Added default SqlReturnResultSet parameter named '" + rsName + "'");
}
}
}
else {
......
......@@ -24,7 +24,8 @@ import org.springframework.jdbc.core.SqlParameter;
/**
* Interface specifying the API to be implemented by a class providing call metadata.
* This is intended for internal use by Spring's
*
* <p>This is intended for internal use by Spring's
* {@link org.springframework.jdbc.core.simple.SimpleJdbcCall}.
*
* @author Thomas Risberg
......@@ -74,15 +75,15 @@ public interface CallMetaDataProvider {
/**
* Provide any modification of the catalog name passed in to match the meta data currently used.
* The returned value will be used for meta data lookups. This could include altering the case used
* or providing a base catalog if none is provided.
* The returned value will be used for meta data lookups. This could include altering the case
* used or providing a base catalog if none is provided.
*/
String metaDataCatalogNameToUse(String catalogName) ;
/**
* Provide any modification of the schema name passed in to match the meta data currently used.
* The returned value will be used for meta data lookups. This could include altering the case used
* or providing a base schema if none is provided.
* The returned value will be used for meta data lookups. This could include altering the case
* used or providing a base schema if none is provided.
*/
String metaDataSchemaNameToUse(String schemaName) ;
......@@ -94,8 +95,8 @@ public interface CallMetaDataProvider {
String parameterNameToUse(String parameterName);
/**
* Create a default out parameter based on the provided meta data. This is used when no
* explicit parameter declaration has been made.
* Create a default out parameter based on the provided meta data.
* This is used when no explicit parameter declaration has been made.
* @param parameterName the name of the parameter
* @param meta meta data used for this call
* @return the configured SqlOutParameter
......@@ -103,8 +104,8 @@ public interface CallMetaDataProvider {
SqlParameter createDefaultOutParameter(String parameterName, CallParameterMetaData meta);
/**
* Create a default inout parameter based on the provided meta data. This is used when no
* explicit parameter declaration has been made.
* Create a default inout parameter based on the provided meta data.
* This is used when no explicit parameter declaration has been made.
* @param parameterName the name of the parameter
* @param meta meta data used for this call
* @return the configured SqlInOutParameter
......@@ -112,8 +113,8 @@ public interface CallMetaDataProvider {
SqlParameter createDefaultInOutParameter(String parameterName, CallParameterMetaData meta);
/**
* Create a default in parameter based on the provided meta data. This is used when no
* explicit parameter declaration has been made.
* Create a default in parameter based on the provided meta data.
* This is used when no explicit parameter declaration has been made.
* @param parameterName the name of the parameter
* @param meta meta data used for this call
* @return the configured SqlParameter
......@@ -121,26 +122,26 @@ public interface CallMetaDataProvider {
SqlParameter createDefaultInParameter(String parameterName, CallParameterMetaData meta);
/**
* Get the name of the current user. Useful for meta data lookups etc.
* Get the name of the current user. Useful for meta data lookups etc.
* @return current user name from database connection
*/
String getUserName();
/**
* Does this database support returning resultsets that should be retrieved with the JDBC call
* Does this database support returning ResultSets that should be retrieved with the JDBC call.
* {@link java.sql.Statement#getResultSet()}
*/
boolean isReturnResultSetSupported();
/**
* Does this database support returning resultsets as ref cursors to be retrieved with
* Does this database support returning ResultSets as ref cursors to be retrieved with
* {@link java.sql.CallableStatement#getObject(int)} for the specified column.
*/
boolean isRefCursorSupported();
/**
* Get the {@link java.sql.Types} type for columns that return resultsets as ref cursors if this feature
* is supported.
* Get the {@link java.sql.Types} type for columns that return ResultSets as ref cursors
* if this feature is supported.
*/
int getRefCursorSqlType();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册