【发布时间】:2020-07-27 09:49:09
【问题描述】:
从 JDBC 执行 Sybase 过程时,出现以下错误:
在包含非 SELECT 的过程上声明执行游标 或带有 COMPUTE 子句的 SELECT。对于这个游标的声明 是合法的,它应该有一个没有计算的选择语句 子句
我正在使用 JCONN4 sybase jar。 sybase 是否对过程有这样的限制,没有带有计算子句的 select 语句?
我也搜索了 Sybase 文档,但没有得到正确的答案。
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.39996_1250/html/svrtsg/svrtsg348.htm
我不能在这里发布程序,但我可以发布示例
create proc sample (@value_date datetime = null) as
begin
if @value_date is null
select @value_date = some_column from some_table
select a,b,c,d into #ad
from
table_a where a='something'
select a,b,c,d case when a=0 then 0 else b/a
from #ad
end
使用 sybStatemt.executeQuery 函数调用上述过程
看起来像它的 Sybase 错误。重现问题的步骤
创建一个过程,其中包含如上所述的 select with compute 子句
编写jdbc程序并使用以下方法 statement.setFetchSize(1000);
执行程序会看到错误
现在的问题是 Sybase 真的有这些限制,还是只针对他们的驱动程序,我们可以说它的驱动程序问题?
【问题讨论】:
-
您能在此处发布您尝试执行的 SQL/SELECT/代码提取吗?
-
嗨,我已经添加了示例过程。如果您需要更多信息,请告诉我
-
我不知道 Sybase,但我猜你需要使用
execute()而不是executeQuery并根据布尔返回值处理更新计数和结果集,并使用getMoreResults()移动到下一个结果(再次更新计数或结果集),或者您可能需要在过程开始时添加set nocount on。 -
另外,您的
case语句似乎缺少end,它可能需要一个明确的别名。 -
是否使用 CallableStatement 而不是 PrepareStatement 调用 Sybase 过程?