簡體   English   中英

使用GROOVY SQL從SQL SERVER存儲過程獲取結果集

[英]Getting a result set from a SQL SERVER stored procedure using GROOVY SQL

我正在嘗試從我的GRAILS應用程序中的SQL SERVER(我相信是2005)中的存儲過程中獲取結果集。 (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())  
}  

每次運行並修改計數器(也就是不為零)時,都會引發異常。 但是,如果我從SQLDBX運行execute procedure1 @year='2011' ,並且計數器不為零,則它將返回我期望的值。

我也嘗試了Groovy SQL類中的幾種不同方法,所有這些方法似乎都拋出了該異常,或者不是我想要的。

例外是

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

如果您需要更多信息,請告訴我。

在您的程序中的AS之后添加SET NOCOUNT ON 添加此內容將告訴sql server不要在sproc中返回修改后的記錄數。

這是文件...

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

executeQuery()用於與返回ResultSet的查詢(通常為SELECT語句)一起使用。

executeUpdate()用於返回更新計數的INSERT,UPDATE,DELETE或DDL語句。

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代碼中,對“ SPPARENT”進行SP調用。

見我的答案在這里為可以處理存儲過程的結果集以類似的方式,以一個實用程序groovy.sql.Sql

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM