I would like to report a potential bug/regression occurred after upgrading Spring Boot (and its dependencies) to 3.5.x from 3.4.x. I know that the problem is not in Boot itself, maybe in a subproject or in the change log.
I subclass the StoredProcedure
class in order to invoke stored procedures
@Repository
@Transactional(propagation = Propagation.MANDATORY, transactionManager = "mdbTransactionManager")
public class GetAccountFromIbanProcedure extends StoredProcedure {
@Autowired
protected GetAccountFromIbanProcedure(@Qualifier("mdbJdbcTemplate") JdbcTemplate jdbcTemplate) {
super(jdbcTemplate, "MASTERDATA.GETACCOUNTFROMIBAN");
}
@Override
public void afterPropertiesSet() {
declareParameter(new SqlParameter("iban", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("returnCode", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("msgCode", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("institution", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("branchCode", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("accountType", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("accountNumber", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("realIban", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("disposizione", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("validationStatus", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("validationSource", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("postvalSource", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("postvalTrace", VARCHAR.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("masterdataLapse", DECIMAL.getVendorTypeNumber()));
declareParameter(new SqlOutParameter("failbackLapse", DECIMAL.getVendorTypeNumber()));
declareParameter(new SqlParameter("failbackEnabled", BOOLEAN.getVendorTypeNumber()));
declareParameter(new SqlParameter("errorRetry", DECIMAL.getVendorTypeNumber()));
declareParameter(new SqlParameter("cacheEnabled", BOOLEAN.getVendorTypeNumber()));
declareParameter(new SqlParameter("debugEnabled", BOOLEAN.getVendorTypeNumber()));
super.afterPropertiesSet();
}
public AccountFromIbanDto execute(String iban) {
var out = execute(Map.of("iban", iban,
"failbackEnabled", false,
"errorRetry", 1,
"cacheEnabled", true,
"debugEnabled", false
));
AccountFromIbanDto.AccountFromIbanDtoBuilder accountFromIbanDtoBuilder = AccountFromIbanDto.builder()
.iban(iban)
.returnCode((String) out.get("returnCode"))
.msgCode((String) out.get("msgCode"))
.institution((String) out.get("institution"))
.branchCode((String) out.get("branchCode"))
.accountType((String) out.get("accountType"))
.accountNumber((String) out.get("accountNumber"))
.realIban((String) out.get("realIban"))
.disposizione((String) out.get("disposizione"))
.validationStatus((String) out.get("validationStatus"))
.validationSource((String) out.get("validationSource"))
.postvalSource((String) out.get("postvalSource"))
.postvalTrace((String) out.get("postvalTrace"));
if (out.get("masterdataLapse") != null) {
accountFromIbanDtoBuilder
.masterdataLapse(((BigDecimal) out.get("masterdataLapse")).intValue());
}
if (out.get("failbackLapse") != null) {
accountFromIbanDtoBuilder
.fallbackLapse(((BigDecimal) out.get("failbackLapse")).intValue());
}
return accountFromIbanDtoBuilder.build();
}
}
Using Spring Boot 3.4.x, up to 3.4.8, the above code yields the desired results. From 3.5, instead, I consistently experience the following especially with all procedures
Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GETACCOUNTFROMIBAN'
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GETACCOUNTFROMIBAN'
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GETACCOUNTFROMIBAN'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Note that, in reality, the argument name doesn't perfectly match the name declared at stored procedure level
declare
I_IBAN VARCHAR2(4000) := '';
O_RETCODE VARCHAR2(4000);
O_MSGCODE VARCHAR2(4000);
O_ISTITUTO VARCHAR2(4000);
O_FILIALE VARCHAR2(4000);
O_ACCNTTYPE VARCHAR2(4000);
O_ACCNTNR VARCHAR2(4000);
O_IBAN_REALE VARCHAR2(4000);
O_DISPOSIZIONE VARCHAR2(4000);
O_VALIDATION_STATUS VARCHAR2(4000);
O_VALIDATION_SOURCE VARCHAR2(4000);
O_POSTVAL_SOURCE VARCHAR2(4000);
O_POSTVAL_TRACE VARCHAR2(4000);
O_MASTERDATA_LAPSE NUMBER;
O_FAILBACK_LAPSE NUMBER;
I_FAILBACK_ENABLED BOOLEAN := null;
I_ERROR_RETRY NUMBER := 0;
I_CACHE_ENABLED BOOLEAN := null;
I_DEBUG_ENABLED BOOLEAN := null;
The point for this issue is: was I supposed to know that from 3.4.8 to 3.5.x Spring JDBC starts to validate exact parameter name correspondence with the stored procedure? Or is it a side effect of something else? Since the error is generated at Oracle driver level, I wonder, for example, if the upgrade of the Oracle driver causes this behaviour indirectly.
Thanks for the help, I thought I reviewed the change log enough
Comment From: snicoll
Since the error is generated at Oracle driver level, I wonder, for example, if the upgrade of the Oracle driver causes this behaviour indirectly.
I don't know but, as you've alluded yourself, this isn't the right place to ask. You haven't say which version of Spring Boot 3.5 is triggering the issue. If the Oracle driver is different, downgrading it should help you figure out if it is the culprit. If that doesn't help, it could be a regression in Spring Framework, which isn't handled here.
If downgrading the Oracle driver doesn't help, please create a small sample and open a Spring Framework issue.