Fix Sybase SimpleJdbcCall named parameter binding

This commit is contained in:
Giuseppe Milicia 2023-03-29 20:49:41 +02:00 committed by Juergen Hoeller
parent b3a3b79b44
commit 748dd94dab
5 changed files with 38 additions and 1 deletions

View File

@ -676,7 +676,9 @@ public class CallMetaDataContext {
* @since 4.2
*/
protected String createParameterBinding(SqlParameter parameter) {
return (isNamedBinding() ? parameter.getName() + " => ?" : "?");
Assert.state(this.metaDataProvider != null, "No CallMetaDataProvider available");
return (isNamedBinding() ? this.metaDataProvider.namedParamBindingToUse(parameter.getName()) : "?");
}
private static String lowerCase(@Nullable String paramName) {

View File

@ -180,4 +180,11 @@ public interface CallMetaDataProvider {
*/
boolean isSupportsSchemasInProcedureCalls();
/**
* Returns the name of the named parameter to use for binding the given parameter name.
* @param paramName the name of the parameter to bind
* @return the name of the named parameter to use for binding the given parameter name,
*/
String namedParamBindingToUse(@Nullable String paramName);
}

View File

@ -246,6 +246,16 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
return this.supportsSchemasInProcedureCalls;
}
/**
* Returns the name of the named parameter to use for binding the given parameter name.
* @param paramName the name of the parameter to bind
* @return the name of the named parameter to use for binding the given parameter name,
*/
@Override
public String namedParamBindingToUse(@Nullable String paramName) {
return paramName + " => ?";
}
/**
* Specify whether the database uses upper case for identifiers.
*/

View File

@ -60,4 +60,9 @@ public class SybaseCallMetaDataProvider extends GenericCallMetaDataProvider {
RETURN_VALUE_NAME.equals(parameterNameToUse(parameterName)));
}
@Override
public String namedParamBindingToUse(@Nullable String paramName) {
return paramName + " = ?";
}
}

View File

@ -349,4 +349,17 @@ class SimpleJdbcCallTests {
verify(procedureColumnsResultSet).close();
}
@Test
void correctSybaseFunctionStatementNamed() throws Exception {
given(databaseMetaData.getDatabaseProductName()).willReturn("Sybase");
SimpleJdbcCall adder = new SimpleJdbcCall(dataSource)
.withoutProcedureColumnMetaDataAccess()
.withNamedBinding()
.withProcedureName("ADD_INVOICE")
.declareParameters(new SqlParameter("@AMOUNT", Types.NUMERIC))
.declareParameters(new SqlParameter("@CUSTID", Types.NUMERIC));
adder.compile();
verifyStatement(adder, "{call ADD_INVOICE(@AMOUNT = ?, @CUSTID = ?)}");
}
}