java.sql.SQLException: процедура или функция ... ожидает параметр ..., который не был предоставлен - PullRequest
1 голос
/ 11 января 2012

При выполнении daoMethod() я получаю следующее исключение:

java.sql.SQLException: процедура или функция 'Get_Books' ожидает параметр '@totalRowsReturned', который не был предоставлен.

Почему? Я определил @totalRowsReturned как ВЫХОД. И я не понимаю, почему я должен предоставить @totalRowsReturned - это выходной параметр, а не входной.

Дао класс:

public class BookDao {

    @Autowired
    DataSource dataSource;

    public void daoMethod() {

        Integer programIdLocal = null;

        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("bookId", 1);

        MyStoredProcedure storedProcedure = new MyStoredProcedure(dataSource);      

        //Exception!!!!
        Map<String, Object> results = storedProcedure.execute(parameters);

    }

    private class MyStoredProcedure extends StoredProcedure {

        private static final String SQL = "dbo.Get_Books";

        public MyStoredProcedure(DataSource dataSource) {
            setDataSource(dataSource);
            setFunction(true);
            setSql(SQL);

            declareParameter(new SqlReturnResultSet("rs", new BookMapper()));

            declareParameter(new SqlOutParameter("totalRowsReturned", Types.INTEGER));

            declareParameter(new SqlParameter("bookId", Types.INTEGER));

            setFunction(true);

            compile();
        }

    }   
}

Хранимая процедура:

CREATE PROCEDURE [dbo].[Get_Books]

    @bookId int,
    @totalRowsReturned int OUTPUT

AS

BEGIN

  SET NOCOUNT ON;
  DECLARE @SelectQuery NVARCHAR(2000)

  DECLARE @first_id int
  DECLARE @totalRows int

  SET @SelectQuery = 'FROM books b WHERE b.book_id >= @bookId'

  Set @SelectQuery = 'SELECT @first_id = b.book_id , @totalRows=Count(*) OVER() ' + @SelectQuery + ' ORDER BY b.book_id'
  Execute sp_Executesql @SelectQuery, N'@first_id int, @bookId int, @totalRows int OUTPUT', @first_id, @bookId, @totalRows=@totalRowsReturned OUTPUT

END

1 Ответ

3 голосов
/ 11 января 2012

В Javadoc для StoredProcedure#declareParameter() есть важное предостережение о том, что вы должны объявить параметры в порядке, в котором они объявлены в хранимой процедуре, предположительно потому, что такое же ограничение существует для базового CallableStatement класс .Это означает, что вы должны объявить @bookId до @totalRowsReturned.

Кроме того, я не совсем осведомлен о JdbcTemplate, но на основе этого примера , я не думаю, что вынеобходимо объявить параметр набора результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...