2012-01-10 3 views
0

При выполнении daoMethod() я получаю следующее исключение:java.sql.SQLException: Процедура или функция ... ожидает параметр ..., который не был поставлен

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

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

Dao Класс:

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, @[email protected] OUTPUT 

END 

ответ

2

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

Кроме того, я не настолько осведомлен о JdbcTemplate, но, based on this example, я не думаю, что вам нужно объявить параметр набора результатов.

+0

Спасибо - я изменил порядок, и это исключение прошло (мне также пришлось изменить на 'setFunction (false);' - поскольку эта процедура не является функцией. Проблема в том, что я получаю исключение: * * java.sql.SQLException: Должен объявить скалярную переменную «@totalRows». ** Любые идеи, почему? – rapt

+0

Это не решение проблемы – divine

Смежные вопросы

 Смежные вопросы