2013-07-03 117 views
0

我已經使用了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作爲函數的返回值問題的根源...

回答

0

我不認爲你缺少基本的東西 - 因爲據我所知,你被卡住編號參數。

您可以通過定義一些常量(或使用ENUM)

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

...... 

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

模擬命名的參數,但我認爲這是接近你會得到

+0

調用存儲過程(不一個函數)同時具有輸入和輸出參數**可以很好地處理參數名稱**。我無法理解,爲什麼在調用函數時不能使用參數名稱。有什麼不同? – horgh

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

的問題是:

  • If you are using setXXX(int,...) , setXXXAtName(String,...) or a combination of both, then any output parameter is bound with registerOutParameter(int,...) and notregisterOutParameter(String,...) , which is for named parameter notation.

查看更多的Interface oracle.jdbc.OracleCallableStatement

UPDATE

檢查的例子在書中Expert Oracle JDBC Programming(你可以下載代碼),在第6章

對於錯誤,請參閱https://forums.oracle.com/thread/2331885

+0

+1:謝謝你的鏈接。這真的很有幫助。但是,您正在解決鏈接下的* Note *文章的第二點。但在我看來,我的情況應該解決第一個問題:* setXXX(String,...)和registerOutParameter(String,...)方法只能在所有綁定僅僅是過程或函數參數的情況下使用。該語句不能包含其他綁定,參數綁定必須用問號(?)表示,而不是:XX。* ....並根據此,我沒有看到任何*小問題*。我錯了嗎? – horgh

+0

我的意思是我只使用*?*符號來表示參數,並且通過名稱(而不是數字)來設置這兩個參數。就我所知,這應該夠了。或者我錯過了什麼? – horgh

+0

你真是太棒了!你可以使用你的函數中的實際名稱。 –

相關問題