我已經使用了Returning a JDBC result set from an Oracle stored procedure文章中顯示的方法。我可以使用CURSOR函數的命名參數嗎?
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: line 1, column 12:
PLS-00103: Encountered the symbol ">" when expecting one of the following:
:= . (@ % ; The symbol "; was inserted before ">" to continue.
有什麼特殊的約定,我應該用來命名函數返回值?或者這甚至有可能?
P.S .:我實際上是java的新手,主要是使用.Net;所以我可能會錯過一些非常基本的東西。
修訂
這似乎是調用帶有兩個輸入參數,一個輸出參數和函數的返回值本身是一個更復雜的功能時,我沒有得到這個錯誤。在這種情況下,命名參數運行良好。
似乎從OracleTypes.CURSOR
作爲函數的返回值問題的根源...
調用存儲過程(不一個函數)同時具有輸入和輸出參數**可以很好地處理參數名稱**。我無法理解,爲什麼在調用函數時不能使用參數名稱。有什麼不同? – horgh