Example usage for org.springframework.jdbc.core SqlParameter isResultsParameter

List of usage examples for org.springframework.jdbc.core SqlParameter isResultsParameter

Introduction

In this page you can find the example usage for org.springframework.jdbc.core SqlParameter isResultsParameter.

Prototype

public boolean isResultsParameter() 

Source Link

Document

Return whether this parameter is an implicit return parameter used during the results processing of CallableStatement.getMoreResults/getUpdateCount .

Usage

From source file:cc.tooyoung.common.db.JdbcTemplate.java

/**
 * Extract output parameters from the completed stored procedure.
 * @param cs JDBC wrapper for the stored procedure
 * @param parameters parameter list for the stored procedure
 * @return Map that contains returned results
 *//*from  w ww.  j  a  v  a 2 s  .  c  o  m*/
@SuppressWarnings("unchecked")
protected Map extractOutputParameters(CallableStatement cs, List parameters) throws SQLException {
    Map returnedResults = new HashMap();
    int sqlColIndex = 1;
    for (int i = 0; i < parameters.size(); i++) {
        SqlParameter param = (SqlParameter) parameters.get(i);
        if (param instanceof SqlOutParameter) {
            SqlOutParameter outParam = (SqlOutParameter) param;
            if (outParam.isReturnTypeSupported()) {
                Object out = outParam.getSqlReturnType().getTypeValue(cs, sqlColIndex, outParam.getSqlType(),
                        outParam.getTypeName());
                returnedResults.put(outParam.getName(), out);
            } else {
                Object out = cs.getObject(sqlColIndex);
                if (out instanceof ResultSet) {
                    if (outParam.isResultSetSupported()) {
                        returnedResults.putAll(processResultSet((ResultSet) out, outParam));
                    } else {
                        String rsName = outParam.getName();
                        SqlReturnResultSet rsParam = new SqlReturnResultSet(rsName, new ColumnMapRowMapper());
                        returnedResults.putAll(processResultSet(cs.getResultSet(), rsParam));
                        ApiLogger.info("Added default SqlReturnResultSet parameter named " + rsName);
                    }
                } else {
                    returnedResults.put(outParam.getName(), out);
                }
            }
        }
        if (!(param.isResultsParameter())) {
            sqlColIndex++;
        }
    }
    return returnedResults;
}

From source file:org.springframework.jdbc.core.metadata.CallMetaDataContext.java

/**
 * Reconcile the provided parameters with available metadata and add new ones where appropriate.
 */// w ww  .  java 2s. c o m
protected List<SqlParameter> reconcileParameters(List<SqlParameter> parameters) {
    CallMetaDataProvider provider = obtainMetaDataProvider();

    final List<SqlParameter> declaredReturnParams = new ArrayList<>();
    final Map<String, SqlParameter> declaredParams = new LinkedHashMap<>();
    boolean returnDeclared = false;
    List<String> outParamNames = new ArrayList<>();
    List<String> metaDataParamNames = new ArrayList<>();

    // Get the names of the meta data parameters
    for (CallParameterMetaData meta : provider.getCallParameterMetaData()) {
        if (meta.getParameterType() != DatabaseMetaData.procedureColumnReturn) {
            metaDataParamNames.add(lowerCase(meta.getParameterName()));
        }
    }

    // Separate implicit return parameters from explicit parameters...
    for (SqlParameter param : parameters) {
        if (param.isResultsParameter()) {
            declaredReturnParams.add(param);
        } else {
            String paramName = param.getName();
            if (paramName == null) {
                throw new IllegalArgumentException("Anonymous parameters not supported for calls - "
                        + "please specify a name for the parameter of SQL type " + param.getSqlType());
            }
            String paramNameToMatch = lowerCase(provider.parameterNameToUse(paramName));
            declaredParams.put(paramNameToMatch, param);
            if (param instanceof SqlOutParameter) {
                outParamNames.add(paramName);
                if (isFunction() && !metaDataParamNames.contains(paramNameToMatch)) {
                    if (!returnDeclared) {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Using declared out parameter '" + paramName
                                    + "' for function return value");
                        }
                        setFunctionReturnName(paramName);
                        returnDeclared = true;
                    }
                }
            }
        }
    }
    setOutParameterNames(outParamNames);

    List<SqlParameter> workParams = new ArrayList<>();
    workParams.addAll(declaredReturnParams);

    if (!provider.isProcedureColumnMetaDataUsed()) {
        workParams.addAll(declaredParams.values());
        return workParams;
    }

    Map<String, String> limitedInParamNamesMap = new HashMap<>(this.limitedInParameterNames.size());
    for (String limitedParamName : this.limitedInParameterNames) {
        limitedInParamNamesMap.put(lowerCase(provider.parameterNameToUse(limitedParamName)), limitedParamName);
    }

    for (CallParameterMetaData meta : provider.getCallParameterMetaData()) {
        String paramName = meta.getParameterName();
        String paramNameToCheck = null;
        if (paramName != null) {
            paramNameToCheck = lowerCase(provider.parameterNameToUse(paramName));
        }
        String paramNameToUse = provider.parameterNameToUse(paramName);
        if (declaredParams.containsKey(paramNameToCheck)
                || (meta.getParameterType() == DatabaseMetaData.procedureColumnReturn && returnDeclared)) {
            SqlParameter param;
            if (meta.getParameterType() == DatabaseMetaData.procedureColumnReturn) {
                param = declaredParams.get(getFunctionReturnName());
                if (param == null && !getOutParameterNames().isEmpty()) {
                    param = declaredParams.get(getOutParameterNames().get(0).toLowerCase());
                }
                if (param == null) {
                    throw new InvalidDataAccessApiUsageException(
                            "Unable to locate declared parameter for function return value - "
                                    + " add a SqlOutParameter with name '" + getFunctionReturnName() + "'");
                } else if (paramName != null) {
                    setFunctionReturnName(paramName);
                }
            } else {
                param = declaredParams.get(paramNameToCheck);
            }
            if (param != null) {
                workParams.add(param);
                if (logger.isDebugEnabled()) {
                    logger.debug("Using declared parameter for '"
                            + (paramNameToUse != null ? paramNameToUse : getFunctionReturnName()) + "'");
                }
            }
        } else {
            if (meta.getParameterType() == DatabaseMetaData.procedureColumnReturn) {
                if (!isFunction() && !isReturnValueRequired() && paramName != null
                        && provider.byPassReturnParameter(paramName)) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Bypassing metadata return parameter for '" + paramName + "'");
                    }
                } else {
                    String returnNameToUse = (StringUtils.hasLength(paramNameToUse) ? paramNameToUse
                            : getFunctionReturnName());
                    workParams.add(provider.createDefaultOutParameter(returnNameToUse, meta));
                    if (isFunction()) {
                        setFunctionReturnName(returnNameToUse);
                        outParamNames.add(returnNameToUse);
                    }
                    if (logger.isDebugEnabled()) {
                        logger.debug("Added metadata return parameter for '" + returnNameToUse + "'");
                    }
                }
            } else {
                if (paramNameToUse == null) {
                    paramNameToUse = "";
                }
                if (meta.getParameterType() == DatabaseMetaData.procedureColumnOut) {
                    workParams.add(provider.createDefaultOutParameter(paramNameToUse, meta));
                    outParamNames.add(paramNameToUse);
                    if (logger.isDebugEnabled()) {
                        logger.debug("Added metadata out parameter for '" + paramNameToUse + "'");
                    }
                } else if (meta.getParameterType() == DatabaseMetaData.procedureColumnInOut) {
                    workParams.add(provider.createDefaultInOutParameter(paramNameToUse, meta));
                    outParamNames.add(paramNameToUse);
                    if (logger.isDebugEnabled()) {
                        logger.debug("Added metadata in out parameter for '" + paramNameToUse + "'");
                    }
                } else {
                    if (this.limitedInParameterNames.isEmpty()
                            || limitedInParamNamesMap.containsKey(lowerCase(paramNameToUse))) {
                        workParams.add(provider.createDefaultInParameter(paramNameToUse, meta));
                        if (logger.isDebugEnabled()) {
                            logger.debug("Added metadata in parameter for '" + paramNameToUse + "'");
                        }
                    } else {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Limited set of parameters " + limitedInParamNamesMap.keySet()
                                    + " skipped parameter for '" + paramNameToUse + "'");
                        }
                    }
                }
            }
        }
    }

    return workParams;
}

From source file:org.springframework.jdbc.core.metadata.CallMetaDataContext.java

/**
 * Build the call string based on configuration and metadata information.
 * @return the call string to be used/*from  w w  w.  jav a 2 s  .com*/
 */
public String createCallString() {
    Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider available");

    String callString;
    int parameterCount = 0;
    String catalogNameToUse;
    String schemaNameToUse;

    // For Oracle where catalogs are not supported we need to reverse the schema name
    // and the catalog name since the cataog is used for the package name
    if (this.metaDataProvider.isSupportsSchemasInProcedureCalls()
            && !this.metaDataProvider.isSupportsCatalogsInProcedureCalls()) {
        schemaNameToUse = this.metaDataProvider.catalogNameToUse(getCatalogName());
        catalogNameToUse = this.metaDataProvider.schemaNameToUse(getSchemaName());
    } else {
        catalogNameToUse = this.metaDataProvider.catalogNameToUse(getCatalogName());
        schemaNameToUse = this.metaDataProvider.schemaNameToUse(getSchemaName());
    }

    String procedureNameToUse = this.metaDataProvider.procedureNameToUse(getProcedureName());
    if (isFunction() || isReturnValueRequired()) {
        callString = "{? = call " + (StringUtils.hasLength(catalogNameToUse) ? catalogNameToUse + "." : "")
                + (StringUtils.hasLength(schemaNameToUse) ? schemaNameToUse + "." : "") + procedureNameToUse
                + "(";
        parameterCount = -1;
    } else {
        callString = "{call " + (StringUtils.hasLength(catalogNameToUse) ? catalogNameToUse + "." : "")
                + (StringUtils.hasLength(schemaNameToUse) ? schemaNameToUse + "." : "") + procedureNameToUse
                + "(";
    }

    for (SqlParameter parameter : this.callParameters) {
        if (!(parameter.isResultsParameter())) {
            if (parameterCount > 0) {
                callString += ", ";
            }
            if (parameterCount >= 0) {
                callString += createParameterBinding(parameter);
            }
            parameterCount++;
        }
    }
    callString += ")}";

    return callString;
}