【问题标题】:Sybase stored procedure through JDBC通过 JDBC 的 Sybase 存储过程
【发布时间】:2012-08-09 14:28:39
【问题描述】:

这个问题困扰了我很长时间,所以我想在这里得到一些帮助:)

我正在使用 JDBC 连接到一个古老的 Sybase Adaptive server 6 (!!!) 我什至在网上找不到它的 JDBC 驱动程序,所以我从安装目录中复制了它们:)

现在,插入和查询以及所有其余的数据库操作都可以正常工作,但是在调用存储过程时遇到了问题。让我们先从一段 sn-p 代码开始:

CallableStatement loginProcedure = connection.prepareCall("{call Login}");
loginProcedure.executeUpdate();

这是一些正常的过程调用代码。我必须补充一点,登录过程不接受任何参数,也不输出任何东西。它唯一要做的就是在名为 AiCol 的数据库中创建一个变量。我也会很快用程序代码更新这篇文章。

执行上述代码时,出现标准语法异常:

com.sybase.jdbc.SybSQLException: ASA Error -131: Syntax error near 'Login'
    at com.sybase.tds.Tds.processEed(Tds.java)
    at com.sybase.tds.Tds.nextResult(Tds.java)
    at com.sybase.jdbc.ResultGetter.nextResult(ResultGetter.java)
    at com.sybase.jdbc.SybStatement.nextResult(SybStatement.java)
    at com.sybase.jdbc.SybStatement.executeLoop(SybStatement.java)
    at com.sybase.jdbc.SybCallableStatement.execute(SybCallableStatement.java)

以前有人遇到过这个问题吗?这是我第一次调用没有 IN/OUT 参数的存储过程,所以我可能做错了什么:/

提前致谢! /ivo

【问题讨论】:

    标签: java database stored-procedures jdbc sybase-asa


    【解决方案1】:

    只是来自jConnect Documentation 的猜测,但您可能需要使用 SybCallableStatement。

    演示使用参数,但我会尝试使用 executeUpdate 调用它。

    我知道在过去,缺乏对 Sybase 标准 JDBC 的支持,他们有一段时间以自己的方式做事。您可能想查看是否可以找到旧的 jConnect 手册。

    我还认为在 jConnect 之前还有另一个 Java 库。自 ASE 6 以来已经很久了!

    import com.sybase.jdbcx.*;
    
    ....
    
    // prepare the call for the stored procedure to execute as an RPC
    
    String execRPC = "{call " + procName + " (?, ?)}";
    SybCallableStatement scs = (SybCallableStatement) con.prepareCall(execRPC);
    
    // set the values and name the parameters
    
    // also (optional) register for any output parameters
    scs.setString(1, "xyz");
    scs.setParameterName(1, "@p3");
    scs.setInt(2, 123);
    scs.setParameterName(2, "@p1");
    
    // execute the RPC
    // may also process the results using getResultSet()
    // and getMoreResults()
    
    // see the samples for more information on processing results
    ResultSet rs = scs.executeQuery();
    

    【讨论】:

    • 谢谢迈克。我会看看在跟踪旧文档方面我能做些什么。我尝试了SybCallableStatement,但没有成功,我还尝试了PreparedStatement,结果相同:(
    • 我唯一会尝试的另一件事是将它称为 {call Login()},这会有点奇怪,但它似乎出于某种原因不喜欢这种语法。也许尝试 {exec Login} 或它的一些变体。我记得使用过 dblib,因为当时还没有 Java 支持。
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多