Fixed extractOutputParameters to properly extract ResultSet in all cases
Issue: SPR-11076
This commit is contained in:
parent
ccafccbec8
commit
3ff3805ed6
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue