0

我使用了从 Oracle 存储过程返回 JDBC 结果集一文中所示的方法。

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);

这给了我一个预言错误:

java.sql.SQLException:ORA-06550:第 1 行,第 12 列:

PLS-00103:在预期以下情况之一时遇到符号“>”:

:= 。( @ % ; 符号 "; 被插入到">" 之前继续。

我应该使用任何特殊约定来命名函数返回值吗?或者这甚至可能吗?

PS:我实际上是java新手,主要使用.Net;所以我可能会遗漏一些非常基本的东西。


更新

当使用两个输入参数、一个输出参数和函数返回值本身调用更复杂的函数时,我似乎没有收到此错误。在这种情况下,命名参数运行良好。

似乎问题源于OracleTypes.CURSOR函数返回值......

4

2 回答 2

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,...)则任何输出参数都与和not绑定,这用于命名参数表示法。registerOutParameter(int,...) registerOutParameter(String,...)

在接口 oracle.jdbc.OracleCallableStatement中查看更多信息。

更新

查看第 6 章的Expert Oracle JDBC Programming一书中的示例(您可以下载代码) 。

有关错误,请参阅https://forums.oracle.com/thread/2331885

于 2013-07-03T04:19:04.483 回答
0

我不认为你缺少任何基本的东西——据我所知,你被编号参数困住了。

您可以通过定义一些常量(或使用枚举)来模拟命名参数

private final static int returnvalue = 1;
private final static int p_price = 2;

......

stmt.registerOutParameter(returnvalue, OracleTypes.CURSOR);
stmt.setFloat(p_price, price);

但我认为这与你将得到的一样接近

于 2013-07-03T03:28:57.130 回答