SQLServerException при использовании StoredProcedureItemReader - PullRequest
0 голосов
/ 17 июня 2020

Я получаю сообщение об ошибке при попытке использовать StoredProcedureItemReader. У меня есть хранимая процедура, написанная на сервере Microsoft SQL, которая имеет следующие параметры ввода и вывода: Имя хранимой процедуры: person_details Ввод: @From, @To Вывод - это комбинация различных столбцов из разных таблиц.

Вот мой код:

    StoredProcedureItemReader<ClaimExtractDTO> reader = new StoredProcedureItemReader<>();

    SqlParameter[] parameter = {new SqlParameter("@From", java.sql.Types.BIGINT), new SqlParameter("@To", java.sql.Types.BIGINT)};

    PreparedStatementSetter statementValues = new PreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps) throws SQLException {
            ps.setLong(1, minValue); //minValue - Input 1
            ps.setLong(2, maxValue); //maxValue - Input 2
        }
    };  
    reader.setDataSource(dataSource);
    reader.setProcedureName("dbo.person_details");
    reader.setParameters(parameter);
    reader.setPreparedStatementSetter(statementValues);
    reader.setRowMapper(new BeanPropertyRowMapper<>(ClaimExtractDTO.class));    
    return reader;

При запуске вышеуказанного кода я получаю

Caused by: org.springframework.dao.TransientDataAccessResourceException: Executing stored procedure; SQL [{call dbo.person_details(?, ?)}]; The index 0 of the output parameter is not valid.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The index 0 of the output parameter is not valid.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110) ~[spring-jdbc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:229) ~[spring-batch-infrastructure-4.2.3.BUILD-SNAPSHOT.jar:4.2.3.BUILD-SNAPSHOT]
    at org.springframework.batch.item.database.AbstractCursorItemReader.doOpen(AbstractCursorItemReader.java:428) ~[spring-batch-infrastructure-4.2.3.BUILD-SNAPSHOT.jar:4.2.3.BUILD-SNAPSHOT]
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:150) ~[spring-batch-infrastructure-4.2.3.BUILD-SNAPSHOT.jar:4.2.3.BUILD-SNAPSHOT]
    ... 18 common frames omitted
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The index 0 of the output parameter is not valid.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234) ~[mssql-jdbc-7.4.1.jre8.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getterGetParam(SQLServerCallableStatement.java:403) ~[mssql-jdbc-7.4.1.jre8.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getObject(SQLServerCallableStatement.java:705) ~[mssql-jdbc-7.4.1.jre8.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyCallableStatement.getObject(HikariProxyCallableStatement.java) ~[HikariCP-3.4.5.jar:na]
    at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:222) ~[spring-batch-infrastructure-4.2.3.BUILD-SNAPSHOT.jar:4.2.3.BUILD-SNAPSHOT]
    ... 20 common frames omitted

, когда я запускаю хранимую процедуру на сервере SQL, используя exec dbo.person_details '1', '100'; он работает нормально и дает мне результат, состоящий из 20 столбцов из различных таблиц.

Я даже установил set nocount on в Процедуре.

Я пробовал с SqlParameter[] parameter = {new SqlOutParameter("personKey", java.sql.Types.INTEGER), new SqlParameter("@From", java.sql.Types.BIGINT), new SqlParameter("@To", java.sql.Types.BIGINT)}; думая, что должны быть определены параметры вне. Я по-прежнему получаю ту же ошибку, о которой говорилось выше.

Основное содержание процедуры:

USE [employee]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
set nocount on
GO

ALTER PROCEDURE [dbo].[person_details]
@From   BIGINT,
@To     BIGINT
AS
....

Кто-нибудь может сказать мне, как я могу решить эту проблему. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Он работает после того, как я поместил set nocount on в свою процедуру

USE [employee]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[person_details]
@From   BIGINT,
@To     BIGINT
AS
set nocount on;

, и мои параметры SQLParameters будут выглядеть как

SqlParameter[] parameter = {new SqlParameter("@From", java.sql.Types.BIGINT), new SqlParameter("@To", java.sql.Types.BIGINT)};
0 голосов
/ 18 июня 2020

Вам необходимо убедиться, что вы установили SET NOCOUNT ON ВНУТРИ самой хранимой процедуры, чтобы избежать этой ошибки. Никаких выходных параметров не ожидается, но количество строк возвращается как единое.

Вы также запускаете процедуру сохранения напрямую снова SQL Сервер следующим образом:

exec dbo.person_details '1', '100';

т.е. два входных параметра и нет выходные параметры.

Тем не менее, в вашем коде вы устанавливаете следующие параметры:

SqlParameter[] parameter = {new SqlOutParameter("personKey", java.sql.Types.INTEGER), new SqlParameter("@From", java.sql.Types.BIGINT), new SqlParameter("@To", java.sql.Types.BIGINT)};

т.е. один выходной параметр и два входных параметра.

...