Java中的可调用语句不起作用

Posted

技术标签:

【中文标题】Java中的可调用语句不起作用【英文标题】:Callable Statement in Java Not Working 【发布时间】: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 的参数是整数吗?? 是的,我是整数。我也尝试了另一个接受字符串参数的存储过程,我得到了同样的异常 【参考方案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 都是用名称代替位置参数的那个。跨度>

以上是关于Java中的可调用语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

路由中“使用”的Laravel 8数组可调用语法不起作用

为啥禁用舞台可调整大小在 javafx 中不起作用?

为啥手动调整 Visjs 时间线图的高度(可调整大小)不起作用?

为啥准备好的语句在java中不起作用?

php 中的 continue 语句不起作用?

Java中带有sum的SQL语句不起作用