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)
我在這裏損失,嘗試了幾種不同的方式來做到這一點,但我無法找到任何的例子,而且不知道如何正確地做到這一點。
問題,這種方法是,即時通訊使用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
@deebo:在這種情況下,您可以創建一個PL/SQ L過程包裝只接受這兩個參數並用NULL參數調用存儲過程。 – 2010-04-20 09:33:46
問題的根源在於Oracle JDBC驅動程序,其中我有一個不支持Cursors的版本作爲IN參數。我升級了司機,一切都開始神奇地工作。 – deebo 2010-04-22 08:28:22