[英]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中返回修改后的记录数。
这是文件...
executeQuery()用于与返回ResultSet的查询(通常为SELECT语句)一起使用。
executeUpdate()用于返回更新计数的INSERT,UPDATE,DELETE或DDL语句。
JDBC将以上两项(结果集和更新计数)都视为“结果”。 对于返回多个结果的查询,它要求我们调用execute()。
如果存储过程使用临时表,则可能首先返回更新计数,然后返回ResultSet。 您应该使用execute()运行查询,调用getMoreResults()跳过更新计数,然后调用getResultSet()获取所需的ResultSet 。 这里的问题是,我们必须通过多次调用getMoreResults()来进行反复试验,以通过调用getResultSet()来获取所需的结果集。
通过指定“ SET NOCOUNT ON ”,可以取消所有额外的“查询结果”,而不是上述的反复试验。
需要更改,
将您的逻辑放入SP“ SPCHILD”中。 该存储过程将具有逻辑以及临时表的创建。
如下创建一个SP“ SPPARENT”,
CREATE PROCEDURE [dbo].[SPPARENT] @Id int = NULL AS BEGIN SET NOCOUNT ON; EXEC(' SPCHILD @Id = ' + @Id) END
从父级SP“ SPPARENT”中,您必须调用实际的SP,即“ SPCHILD”。
在您的JDBC代码中,对“ SPPARENT”进行SP调用。
见我的答案在这里为可以处理存储过程的结果集以类似的方式,以一个实用程序groovy.sql.Sql
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.