-
Notifications
You must be signed in to change notification settings - Fork 41.4k
Description
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