7

从 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 错误。重现问题的步骤

  1. 如上所述,创建一个具有带有计算子句的 select 的过程

  2. 编写 jdbc 程序并使用下面的方法 statement.setFetchSize(1000);

  3. 执行程序,你会看到错误

现在的问题是 Sybase 真的有这些限制,还是只针对他们的驱动程序,我们可以说它的驱动程序问题?

4

2 回答 2

2

从 sybase 命令提示符运行您的 sp。如果它给出结果,它应该与 sybase 驱动程序一起使用。我在 c# 中使用过 ado.net 驱动程序,它可以运行类似的查询 https://marketplace.visualstudio.com/items?itemName=CDATASOFTWARE.SybaseADONETProvider

你的 Sp 看起来很简单。但我认为你的 sp 有一些运行时问题。

我认为这条线

if @value_date is null 
  select @value_date  = some_column from some_table

应该

if @value_date is null 
  select @value_date  = some_column from some_table where col1='kkk' so that only 

一个价值来了

于 2020-04-24T03:52:01.387 回答
2

调用存储过程时必须使用CallableStatement

如果在将参数值表示为问号的 CallableStatement 对象中执行存储过程,则与同时使用问号和文字值作为参数相比,可以获得更好的性能。此外,如果混合使用文字和问号,则不能将输出参数与存储过程一起使用。

以下示例将 sp_stmt 创建为 CallableStatement 对象,用于执行存储过程 MyProc:

CallableStatement sp_stmt = conn.prepareCall(   "{call MyProc(?,?)}");

MyProc 中的两个参数表示为问号。您可以使用 CallableStatement 接口中的 registerOutParameter 方法将其中一个或两个注册为输出参数。

在以下示例中,sp_stmt2 是一个 CallableStatement 对象,用于执行存储过程 MyProc2。

 CallableStatement sp_stmt2 = conn.prepareCall(   {"call MyProc2(?,'javelin')}");
于 2020-04-19T09:35:38.363 回答