Skip to content

Regression: "Wrong number of arguments" calling Oracle StoredProcedure after upgrading Boot 3.4.8>3.5.3 #46594

@djechelon

Description

@djechelon

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    for: external-projectFor an external project and not something we can fix

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions