我使用了Returning a JDBC result set from an Oracle stored procedure文章中显示的方法。
String query = "{ call ? := sp_get_stocks(?) }";
CallableStatement stmt = conn.prepareCall(query);
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.setFloat(2, price);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(1);
while (rs.next()) {
//...
}
代码完成了这项工作。
但是我倾向于在我的代码中使用命名参数,并希望将其更改为:
stmt.registerOutParameter("returnvalue", OracleTypes.CURSOR);
stmt.setFloat("p$price", price);
这给了我一个oracle错误:
java.sql.SQLException:ORA-06550:第1行,第12列:
PLS-00103:遇到符号“>”期待以下之一:
:=。 (@%;符号“;在”>“之前插入以继续。
我应该使用什么特殊约定来命名函数返回值吗?或者这甚至可能吗?
P.S。:我实际上是java新手,因为主要使用.Net;所以我可能会遗漏一些非常基本的东西。
已更新
当使用两个输入参数,一个输出参数和函数返回值本身调用一个更复杂的函数时,我似乎没有得到这个错误。在这种情况下,命名参数效果很好。
似乎问题起源于OracleTypes.CURSOR
作为函数返回值......
答案 0 :(得分:1)
有一点问题,但你可以这样做:
OracleCallableStatement cs = (OracleCallableStatement) connection
.prepareCall("begin :a := TEST(:b); end;");
cs.setDateAtName("b", new java.sql.Date(1));
cs.registerOutParameter(1, Types.DATE);
cs.execute();
问题是:
- 如果您使用的是
setXXX(int,...)
,setXXXAtName(String,...)
或两者的组合,那么输出参数 绑定registerOutParameter(int,...)
和 不registerOutParameter(String,...)
,用于命名参数表示法。
在Interface oracle.jdbc.OracleCallableStatement中查看更多内容。
<强>更新强>
在第6章的书Expert Oracle JDBC Programming中查看示例(您可以下载代码)。
答案 1 :(得分:0)
我不认为你遗漏任何基本的东西 - 据我所知,你被困在编号参数中。
您可以通过定义一些常量(或使用枚举)来模拟命名参数
private final static int returnvalue = 1;
private final static int p_price = 2;
......
stmt.registerOutParameter(returnvalue, OracleTypes.CURSOR);
stmt.setFloat(p_price, price);
但我认为这与你将会得到的一样接近