繁体   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