2009-10-07 24 views
2

鑑於以下功能:我可以更新Oracle存儲過程(Java中的)的結果(sys_refcursor)嗎?

create or replace FUNCTION "GETADDRESSES" 
    RETURN sys_refcursor 
IS 
    address_cursor sys_refcursor; 
BEGIN 
    OPEN address_cursor FOR 
     SELECT * FROM Address; 
    RETURN address_cursor; 
END; 

我希望能夠修改這一結果在Java中集和後更改回數據庫。它在Java中使用以下方式調用:

 String genericQuery = "{ call ? := getAddresses() }"; 
     CallableStatement stmt = connection.prepareCall(genericQuery, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

     stmt.registerOutParameter(1, OracleTypes.CURSOR); 
     stmt.execute(); 
     ResultSet rs = (ResultSet)stmt.getObject(1); 
     while (rs.next()) 
     { 
      System.out.println (rs.getString(2)); 
      rs.updateString(2, "*" + rs.getString(2)); 
     } 
     stmt.close(); 

它引發了一個異常「只讀結果集的無效操作」。有沒有辦法將這個遊標作爲可以更新並返回到Java的數據庫的東西?我正在使用Oracle 10g。

謝謝,羅布

回答

1

的問題是,當您指定CONCUR_UPDATABLE,適用於該函數的調用ResultSet的本身 - 如果有一個,它沒有。您通過getObject()獲取的ResultSet對象不是CallableStatement的ResultSet,因此它默認情況下不可更新。

我的第一個想法是,在函數中向查詢添加FOR UPDATE可能會使ResultSet可更新,但沒有運氣。

我看不到任何與JDBC通信的方式,即在這種情況下結果集應該是可更新的。

+0

謝謝,但是一旦我這樣做,我會在rs.next()調用中出現錯誤「取出序列」。我需要在存儲過程中執行其他操作嗎? – 2009-10-07 16:11:41

+0

如果您添加FOR UPDATE,那麼您需要關閉自動提交 - 您無法在提取之間進行提交。但在我的測試中,添加FOR UPDATE並沒有幫助。 – 2009-10-07 19:20:39

+0

這很有道理,非常感謝您的努力。 – 2009-10-08 08:35:19

相關問題