JDBC SQL Server: значение не задано для номера параметра

Я получил следующую ошибку из кода, который вызывает хранимую процедуру из java-кода:

Трассировка исключения {} org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; не классифицированный SQLException для SQL [{вызов test.usp_xxx_GetCompanyDetails (?,?,?,?,?,?,?,?,?,?,?)}]; Состояние SQL [null]; код ошибки [0]; Значение не установлено для номера параметра 11; вложенное исключение - com.microsoft.sqlserver.jdbc.SQLServerException: значение не задано для номера параметра 11. на org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) на org.springframework.jdbc. support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) в org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) в org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1095) на org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1131)

Приложение развернуто на WAS 8.5.5 и с использованием драйвера jdbc версии 4.2. При перезапуске сервера эта проблема больше не повторялась. Вызываемый следующий оператор вызова выглядит некорректным. Есть последовательные запятые без? между ними.

{call test.usp_xxx_GetCompanyDetails (?,?,?,?,?,?,?,?,?,?,?)}

Хранимая процедура имеет 10 параметров. Ниже приведено определение хранимой процедуры:

CREATE PROCEDURE [test].[usp_xxx_GetCompanyDetails]
(
    @ANumber        int,
    @CompanyId      int,
    @UserRole       varchar(15),
    @RequestId      varchar(100),
    @CompanyCode    varchar(5),
    @BaseSystem     varchar(5),
    @PType          varchar(20),    
    @PId            varchar(40),
    @IsActive       bit,     
    @responseData   xml OUT
)

Ниже приведен код Java, который вызывает вызов хранимой процедуры. Для передачи вызова используются данные весны.

 private String executeProc(Integer aNumber,Integer companyId, String baseSystem, 
                String role,String companyCode,String requestId, String pType,String pId,
                boolean isActive ) throws SQLException {

            SQLXML responseData=null;
            Map<String,Object> inputParams= new HashMap<>();
            inputParams.put("ANumber", aNumber);
            inputParams.put("CompanyId", companyId);
            inputParams.put("UserRole", role);
            inputParams.put("RequestId", requestId);
            inputParams.put("CompanyCode", companyCode);
            inputParams.put("BaseSystem", baseSystem);
            inputParams.put("PType", pType);
            inputParams.put("PId", pId);
            inputParams.put("IsActive", isActive);
            inputParams.put("ResponseData", responseData);

            Map<String, Object> result = this.execute(inputParams);
            String responseXMLString = ((SQLXML) result.get("ResponseData")).getString();

            return responseXMLString;
        }

Что могло пойти не так.

Ответ 1

У вас есть 11 обязательных параметров (?), А также пустые параметры , ,. Удалите его для работы с процедурой с 9 входными параметрами и 1 выходным параметром

{call test.usp_xxx_GetCompanyDetails(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}

Ответ 2

Вам нужно зарегистрировать параметр out, вы можете попробовать как это

cs.registerOutParameter("ResponseData", java.sql.Types.VARCHAR);