Получение набора результатов из хранимой процедуры SQL SERVER с использованием GROOVY SQL - PullRequest
2 голосов
/ 23 мая 2011

Я пытаюсь получить набор результатов из хранимой процедуры в SQL SERVER (я думаю, 2005) из моего приложения GRAILS.(Grails 1.3.2, Groovy 1.7.6)

Хранимая процедура прекрасно работает с любым браузером запросов, я использую SQLDBX, он возвращает набор результатов, как я ожидал все время.

Из моего приложения, однако, он выдаст ОШИБКУ, если процедура на самом деле изменяет данные, но если этого не произойдет, он не выдаст ОШИБКУ и вернет набор результатов, как мне хотелось бы.

Теперь я не могу опубликовать процедуру здесь, но это измененная версия.это делает примерно то же самое.

CREATE PROCEDURE [procedure1]
@year VARCHAR(4)
as
begin
DECLARE @var1 INT
DECLARE @var2 varchar(50)
DECLARE @counter INT

SET @counter=0

set @cursor = CURSOR FAST_FORWARD for
        select *
        FROM [table1] as t1
        INNER JOIN [table2] as t2
        ON t1.f_id = t2.f_id
        WHERE t1.year = @year
open @cursor
set @date = GETDATE()

fetch next from @cursor into @var1,@var2
while @@FETCH_STATUS = 0
begin
    select @numRows = count(id) from table1
    if(@numRows = 0)
    begin
        SET @counter=@counter+1
    END

    fetch next from @cursor into @var1,@var2
end

close @cursor
deallocate @cursor
SELECT @counter AS 'count'
return 0
END
GO

Модифицированная версия не имеет особого смысла, но выполняет те же действия.

Из моего приложения GRAILS я делаю эквивалент

Sql conn = new Sql(dataSource) //A valid declaration  
try{  
  def results = conn.rows("execute [dbo].[procedure1] @year='2011'")  
  println("${results}")  
}  
catch(SQLException e){  
  println(e.getMessage())  
}  

Каждый раз, когда это выполняется, и счетчик был изменен (иначе он не равен нулю), он выдает исключение.Однако, если я запускаю execute procedure1 @year='2011' из SQLDBX, а счетчик не равен нулю, он возвращается, как я и ожидал.

Я также попробовал несколько различных методов из класса Groovy SQL, и все они, похоже,выбросить это исключение или не то, что я ищу.

Исключение составляет

com.microsoft.sqlserver.jdbc.SQLServerException - The statement did not return a result set.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Ответы [ 3 ]

3 голосов
/ 26 июня 2011

Добавьте SET NOCOUNT ON после AS в вашем ответвлении. Добавление этого скажет серверу sql не возвращать количество измененных записей в sproc.

Вот документация ...

http://msdn.microsoft.com/en-us/library/ms189837.aspx

1 голос
/ 24 июля 2013

executeQuery () предназначен для использования с запросами, которые возвращают ResultSet, обычно это операторы SELECT.

executeUpdate () предназначен для операторов INSERT, UPDATE, DELETE или DDL, которые возвращают количество обновлений.

Оба из вышеперечисленных (ResultSets и количество обновлений) рассматриваются JDBC как "результаты".Для запросов, которые возвращают несколько результатов, это требует, мы вызываем execute ().

Если хранимая процедура использует временные таблицы, вероятно, сначала она возвращает счетчик обновлений, а затем ResultSet.Вы должны использовать execute () для запуска запроса, вызвать getMoreResults (), чтобы пропустить счетчик обновлений, а затем вызвать getResultSet (), чтобы получить ResultSet, который вы хотите .Проблема здесь в том, что мы должны делать метод проб и ошибок, вызывая getMoreResults () несколько раз, чтобы получить нужный набор результатов, вызывая getResultSet ().

Вместо описанного выше метода проб и ошибок, вы можете подавить вседополнительные "результаты запроса", указав " SET NOCOUNT ON ".

Требуются изменения,

  1. Поместите свою логику в SP "SPCHILD".Эта хранимая процедура будет иметь логику вместе с созданием временной таблицы.

  2. Создайте SP "SPPARENT", как показано ниже,

     CREATE PROCEDURE [dbo].[SPPARENT]    @Id int = NULL
     AS
     BEGIN
     SET NOCOUNT ON;
     EXEC(' SPCHILD @Id = ' + @Id)
     END
    

    Из родительского SP "SPPARENT" у вас естьдля вызова вашего действующего SP, т.е. «SPCHILD».

  3. Из вашего кода JDBC выполните вызов SP для «SPPARENT».

0 голосов
/ 09 октября 2013

Смотрите мой ответ здесь для утилиты, которая может обрабатывать хранимую процедуру ResultSets аналогично groovy.sql.Sql

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