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中的可调用语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章