【问题标题】:issue while executing Sybase procedure from JDBC从 JDBC 执行 Sybase 过程时出现问题
【发布时间】: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 错误。重现问题的步骤

  1. 创建一个过程,其中包含如上所述的 select with compute 子句

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

  3. 执行程序会看到错误

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

【问题讨论】:

  • 您能在此处发布您尝试执行的 SQL/SELECT/代码提取吗?
  • 嗨,我已经添加了示例过程。如果您需要更多信息,请告诉我
  • 我不知道 Sybase,但我猜你需要使用 execute() 而不是 executeQuery 并根据布尔返回值处理更新计数和结果集,并使用getMoreResults() 移动到下一个结果(再次更新计数或结果集),或者您可能需要在过程开始时添加 set nocount on
  • 另外,您的case 语句似乎缺少end,它可能需要一个明确的别名。
  • 是否使用 CallableStatement 而不是 PrepareStatement 调用 Sybase 过程?

标签: java jdbc sybase jconnect


【解决方案1】:

调用存储过程时必须使用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')}");

【讨论】:

    【解决方案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 
    

    一个值来了

    【讨论】:

    • 嗨,SP 可以在命令行甚至 java 代码中正常运行,但问题是当我使用以下方法限制大小时,它会出错。 statement.fetchSize(100);
    • 请更改 sp 并将大小作为参数发送。 SELECT TOP(5) * FROM Employees ORDER BY Surname;
    • 找不到你,你能详细说明一下吗?
    • 而不是使用 statement.fetchSize(100);您可以使用 top 10 语法来获取 100 行并将 100 作为参数传递给 SP。
    • 那是解决方法,而不是解决方案。我只是想知道它的sybase驱动程序有没有bug
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2021-03-02
    • 2014-08-08
    相关资源
    最近更新 更多