JDBC使用INSERT RETURN語句報錯ORA-439

yangtingkun發表於2011-12-24

在給客戶開發人員講解LOB列的訪問方式後,開發人員嘗試在JDBC中使用包含RETURNINSERT語句,但是出現了ORA-439錯誤。

 

 

檢查後發現客戶的程式使用的還是PreparedStatement語句,而RETURNING語句,則是Oracle擴充套件的SQL語法,因此在宣告語句的時候必須使用OraclePreparedStatement方式進行宣告。

除了修改SQL語句外,使用OraclePreparedStatement宣告語句變數外,還需要註冊輸出引數,類似的程式碼如下:

OraclePreparedStatement sqlstmt =
(OraclePreparedStatement)conn.prepareStatement
("insert into t_lob values (?, ?, empty_clob()) returning contents into ?");
sqlstmt.setInt(1, 1);
sqlstmt.setString(2, "a");
sqlstmt.registerReturnParameter(3, OracleTypes.CLOB);
sqlstat.executeUpdate();
ResultSet resset = sqlstmt.getReturnResultSet();
if (resset.next())
{
CLOB contents = (CLOB)resset.getClob(2);
...
}

不過即使開發人員宣告瞭OraclePreparedStatement語句,仍然找不到registerReturnParameter過程。

當前的資料庫的版本是11.2.0.2,沒有道理不支援RETURN語句,何況JDBCRETURNING語句是從10.2JDBC就引入新特性。

查詢了一下當前客戶端JDBC的驅動版本,發現居然還是9.2的版本,這就難怪使用RETURN語句的時候,會出現ORA-439的錯誤了。

很多時候資料庫的版本已經升級到很高的版本,但是應用程式使用的版本或驅動沒有進行升級,同樣很多新特性無法使用。而且一般而言,推薦客戶端驅動版本和所連線資料庫的版本保持一致,這樣出現BUG的可能性最小。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-713913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章