2010-04-20 52 views
2

它幾乎在標題中說了什麼,應該怎麼做到這一點?JDBC CallableStatement和Oracle SYS_REFCURSOR IN參數?

基本上我需要將一個空(空?)參考光標作爲IN參數傳遞給存儲過程。

/** spring's PreparedStatementSetter#setValues(...) */ 
public void setValues(PreparedStatement ps) throws SQLException { 
    CallableStatement cs = (CallableStatement) ps; 
    cs.setString(1,"constant"); 
    //this is the IN param 
    cs.setNull(2, OracleTypes.CURSOR); 
    //this is the OUT param 
    cs.registerOutParameter(3, OracleTypes.CURSOR); 
} 

而這種失敗:

caused by: java.sql.SQLException: Unsupported feature: sqlType=-10 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4399) 
    at oracle.jdbc.driver.OraclePreparedStatement.setNullInternal(OraclePreparedStatement.java:4161) 
    at oracle.jdbc.driver.OracleCallableStatement.setNull(OracleCallableStatement.java:4472) 

我在這裏損失,嘗試了幾種不同的方式來做到這一點,但我無法找到任何的例子,而且不知道如何正確地做到這一點。

回答

0

我的Java是有些生疏,但你應該能夠初始化REF遊標變量在PL/SQL塊:

String statement = "DECLARE\n" + 
         "l_cursor SYS_REFCURSOR;\n" + 
        "BEGIN\n" + 
         "your_procedure(?, l_cursor, ?);\n" + 
        "END;" 
CallableStatement cs = yourConnection.prepareCall(statement); 
// bind first and last parameter 
cs.setString(1,"constant"); 
cs.registerOutParameter(2, OracleTypes.CURSOR); 
+0

問題,這種方法是,即時通訊使用Spring Batch和一個StoredProcedureItemReader,爲我只是給出了一個String參數,它是過程名稱,以及一個創建CallableStatement的SqlParameter對象列表(請參閱:http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#StoredProcedureItemReader) ,所以除非sring核心jdbc功能中有特別的東西,否則我將被限制爲直接使用CallableStatement引用來設置參數 – deebo 2010-04-20 09:03:33

+0

@deebo:在這種情況下,您可以創建一個PL/SQ L過程包裝只接受這兩個參數並用NULL參數調用存儲過程。 – 2010-04-20 09:33:46

+0

問題的根源在於Oracle JDBC驅動程序,其中我有一個不支持Cursors的版本作爲IN參數。我升級了司機,一切都開始神奇地工作。 – deebo 2010-04-22 08:28:22

相關問題