2015-09-11 13 views
5

Tôi đã trả về thủ tục Db2 trả về con trỏ cho một trong các bảng.Làm thế nào để giải quyết ngoại lệ xảy ra trong quá trình truy xuất CURSOR từ Tuyên bố có thể gọi trong Java?

Thủ tục này được gọi là từ mã java của tôi và truing để lấy con trỏ như một tập hợp kết quả và có log chảy SQLException ngoại lệ,

com.ibm.db2.jcc.am.jo: [jcc][t4][10335][10366][4.7.85] 
Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003 
    at com.ibm.db2.jcc.am.dd.a(dd.java:666) 
    at com.ibm.db2.jcc.am.dd.a(dd.java:60) 

Tôi đã tìm kiếm giải pháp cho ngoại lệ này và tìm thấy giải pháp này trên ibm website link mà đề nghị thay đổi cấu hình nhật ký,

Tăng kích thước tệp nhật ký và số lượng nhật ký chính và phụ tệp. Giá trị num_log_span cũng có thể được điều chỉnh.

Dưới đây là quy trình Ví dụ,

CREATE OR REPLACE PROCEDURE ABC(c_dump OUT SYS_REFCURSOR) IS 
BEGIN 
    open c_dump FOR 
    select feild1,feild1,.... from RSPNSE_TABLE; 
END; 

Java Mã được đưa ra dưới đây,

public void callStoredProc(){ 

     Connection dbConnection = null; 
     CallableStatement callableStatement = null; 
     ResultSet rs = null; 

     String proc = "{call ABC(?)}"; 

     try { 
      dbConnection = connection; 
      callableStatement = dbConnection.prepareCall(proc); 

      callableStatement.registerOutParameter(1, DB2Types.CURSOR); 


      // execute getDBUSERCursor store procedure 
      callableStatement.executeUpdate(); 

      // get cursor and cast it to ResultSet 
      rs = (ResultSet) callableStatement.getObject(1); 


     } catch (SQLException e) { 

      e.printStackTrace(); 
      System.out.println(e.getMessage()); 

     } 

    } 

Bây giờ trong mã java này được phá vỡ ở dòng này callableStatement = dbConnection.prepareCall(proc);

Lưu ý: Mặc dù nhật ký ngoại lệ chứa "Kết nối bị đóng" Tôi muốn đề cập rằng tôi đã thiết lập thành công kết nối với truy xuất bình thường cơ sở dữ liệu bằng cách sử dụng JDBC không có vấn đề gì.

+0

Trình điều khiển cho biết kết nối bị đóng, bạn nói nó không phải; ai tin? Có thể bạn muốn gọi 'isClosed()' hoặc 'isValid()' trên kết nối ngay trước 'PrepareCall()'? – mustaccio

+0

Bạn có thể cung cấp các sản phẩm được sử dụng và số phiên bản không? Trình điều khiển máy chủ, trình điều khiển DB2 và JDBC? –

Trả lời

0

Lỗi cuộc gọi chuẩn bị cho biết bạn không có kết nối mở. Bạn sẽ phải đào sâu vào SQLException và xác định chính xác lý do tại sao.

Các vấn đề liên quan