2012-04-25 87 views
1

我正在使用struts框架。我收到「光標已關閉」錯誤。 我檢查了我的storedprocedure,它在oracle中運行良好,但仍然出現「遊標已關閉」錯誤。光標已關閉

 
    Caused by: 
java.sql.SQLException: Cursor is closed. 
    at oracle.jdbc.driver.T4CResultSetAccessor.getCursor(T4CResultSetAccessor.java:323) 
    at oracle.jdbc.driver.ResultSetAccessor.getObject(ResultSetAccessor.java:85) 
    at oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:1401) 

你能幫我理解是什麼引起了這個問題嗎?

+0

請發表您的代碼,在您看來,導致這使我們可以看看 – Satya 2012-04-25 08:51:32

+1

Struts是無關緊要的,這是前端。後端是什麼樣的? – 2012-04-25 08:52:48

+0

@SeanPatrickFloyd:後端是oracle – 2012-04-25 09:14:38

回答

1

由於您尚未提供代碼,但根據我的假設,您將通過打開該過程來返回該過程中的遊標,但同時您可能正在以相同過程關閉遊標。

PROCEDURE S_S_TEST( 
    test_OUT OUT OAS_TYPES.REFCURSOR 
) 
AS 
BEGIN 
    OPEN test_OUT FOR  
     SELECT * 
     FROM table_p; 
    CLOSE test_OUT; 
END S_S_TEST; 

調用存儲過程的客戶端負責關閉遊標。請刪除代碼:CLOSE test_OUT;

參見:Cursor is Closed

0

跌破發行一段時間會來

例:

while (rs.next()) { 


      registartionServices.add(new RegistrationServices(rs.getString(1), rs.getString(2), rs.getString(3), 
        rs.getString(4), rs.getString(5), rs.getString(7), rs.getString(6), rs.getString(9))); 
      noti[i] rs.getString(1); 
      //System.out.println("amountList-" + rs.getString(7)); 
      //amountList.add(rs.getString(7)); 
      //serviceList.add(rs.getString(6)); 
      //serviceListAR.add(rs.getString(6)); 
      i++; 
     } 

在上面的例子中(rs.getString(1))試圖訪問兩次。

而不是分配(rs.getString(1))到一個變量並使用該值。

例:

while (rs.next()) { 
       notid=rs.getString(1); 
       registartionServices.add(new RegistrationServices(notid, rs.getString(2), rs.getString(3), 
         rs.getString(4), rs.getString(5), rs.getString(7), rs.getString(6), rs.getString(9))); 
       noti[i] =notid; 
       //System.out.println("amountList-" + rs.getString(7)); 
       //amountList.add(rs.getString(7)); 
       //serviceList.add(rs.getString(6)); 
       //serviceListAR.add(rs.getString(6)); 
       i++; 
      } 

希望你得到了答案。

0

最初,REF_CURSOR處於關閉狀態,直到您爲特定的SQL查詢打開遊標爲止。您可能會得到這個光標已關閉當您在打開光標前由於某些條件而從未打開光標時發生SQL錯誤。如果條件不滿足,那麼如果沒有故意打開某些虛擬值的遊標,光標永遠不會被打開。以下是一個示例:

IF condition = TRUE THEN 
    OPEN CURSOR cursor_name FOR 
    SELECT * FROM table_name; 
END IF; 

但是在這裏,條件爲FALSE。因此,該過程返回一個未打開的光標。在這樣的情況下,我更喜歡從調用程序中捕捉這個特殊的異常。例如,以下是用於捕獲特定類型的異常並保持沉默的Java代碼。

try 
{ 
    cursor = (ResultSet) stmt.getObject(x); 
} 
catch(SQLException e) 
{ 
    if (!e.getMessage().toLowerCase().contains("cursor is closed")) { 
     e.printStackTrace(); 
    } 
} 

而不是做

try 
{ 
    cursor = (ResultSet) stmt.getObject(x); 
} 
catch(SQLException e) 
{ 
    e.printStackTrace(); 
}