我可以为函数CURSOR结果使用命名参数吗?

时间:2013-07-03 03:02:31

标签: java oracle stored-procedures jdbc cursor

我使用了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作为函数返回值......

2 个答案:

答案 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中查看示例(您可以下载代码)。

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

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

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