JDBC SQL Server: для номера параметра не задано значение - PullRequest
0 голосов
/ 03 сентября 2018

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

Исключительная трассировка {} org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; исключение SQLException для SQL [{call 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;
        }

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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

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

cs.registerOutParameter("ResponseData", java.sql.Types.VARCHAR);
0 голосов
/ 03 сентября 2018

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

{call test.usp_xxx_GetCompanyDetails(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...