【问题标题】:Callable Statement in Java Not WorkingJava中的可调用语句不起作用
【发布时间】:2012-10-11 10:21:58
【问题描述】:

我的 JDBC 驱动程序似乎有问题。

我正在尝试执行以下 java 代码:

String sql = "{call get_samp_stud_no_out (?,?,?)}";
CallableStatement call = conn.prepareCall(sql);
call.setInt("objId1", 1);
call.setInt("objId2", 2);
call.setInt("objId3", 3);
ResultSet results = call.executeQuery();

我得到了:

java.lang.AbstractMethodError: com.sybase.jdbc2.jdbc.SybCallableStatement.setInt(Ljava/lang/String;I)V

顺便说一句,它是一个 sybase 数据库。 jconn2.jar 和 jconn3.jar 我都试过了。

以及其他接受字符串参数的存储过程:

String sql = "{call get_samp_stud_no_name (?,?,?)}";
    CallableStatement call = conn.prepareCall(sql);
    call.setString("objId1", "nappa");
    call.setString("objId2", "vegeta");
    call.setString("objId3", "frieza");
    ResultSet results = call.executeQuery();

这个例外是:

Exception in thread "main" java.lang.AbstractMethodError: com.sybase.jdbc2.jdbc.SybCallableStatement.setString(Ljava/lang/String;Ljava/lang/String;)V

【问题讨论】:

  • get_samp_stud_no_out 的参数是整数吗??
  • 是的,我是整数。我也尝试了另一个接受字符串参数的存储过程,我得到了同样的异常

标签: java jdbc sybase


【解决方案1】:

在 Sybase 驱动程序中,命名参数存在很多问题,我认为这会导致您的问题。
试试:

call.setString("@objId1", "nappa");
call.setString("@objId2", "vegeta");
call.setString("@objId3", "frieza");

call.setString(1, "nappa");
call.setString(2, "vegeta");
call.setString(3, "frieza");

【讨论】:

  • 第一个返回相同的异常,位置参数从一开始就工作正常。但我希望第一个语法工作。
  • 另外 2 个选项:1. 使用 call.execute() 2. 如果存在则注册参数
  • 试过 call.execute() 得到了同样的异常并且 proc 没有返回任何东西。
  • 您到底使用哪个驱动程序?
  • 你注册返回参数了吗? cstmt.setString("p1", value1); cstmt.setString("p2", val2); cstmt.registerOutParameter("outRes", Types.String); cstmt.execute(); String res = cstmt.getString("outRes");
【解决方案2】:

尝试像这样修改您的代码:

String sql = "{?=call get_samp_stud_no_out (?,?,?)}";
CallableStatement call = conn.prepareCall(sql);

call.registerOutParameter(1, Types.INTEGER);
call.setInt(2, 10);
call.setInt(3, 20);
call.setInt(4, 30);
call.execute();
int retVal = call.getInt(1); // return value
call.close();

【讨论】:

  • 试过这个有同样的异常。顺便说一句,异常指向这一行:call.setInt("objId1", 2);
  • 嗯好的,你现在可以试试修改后的代码吗? (将executeQuery() 替换为execute())并更改setInt 调用的顺序,因为第一个参数应该是位置,第二个参数是你的值。
  • 试过这个并得到同样的异常。
  • 另一个编辑:更改了 setInt 调用的顺序,因为第一个参数应该是位置,第二个参数是你的值。请尝试让我知道。
  • 抱歉造成混淆,位置参数工作正常,但是当我使用实际名称时,会导致异常。我上面所有的 cmets 都是用名称代替位置参数的那个。跨度>
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多