2013-07-08 36 views
5

Tôi có một hàm PL/SQL phức tạp được lưu trữ và tôi phải gọi hàm này trong JAVA. Dưới đây là thủ tục:Gọi JDBC đến Oracle Chức năng được lưu trữ - IN tham số loại "bảng cấu trúc"

FUNCTION SUB_REPORT_INCOMPLETE(p_ACT_ID IN ACTIVITIES.ID%TYPE, 
           p_MISSING TO_SUB_MISSING) RETURN VARCHAR2; 

Vì vậy, như bạn có thể thấy ở đây, các loại tham số thứ hai của tôi là TO_SUB_MISSING đó là một bảng O_SUB_MISSING:

CREATE OR REPLACE TYPE TO_SUB_MISSING AS TABLE OF O_SUB_MISSING; 
CREATE OR REPLACE TYPE O_SUB_MISSING AS OBJECT (ACT_ID NUMBER, GIT_ID NUMBER, MISSING_QTY NUMBER); 

Sau một số động nghiên cứu , Tôi viết mã này:

Context context = new InitialContext(); 
DataSource dataSource = (DataSource) context.lookup(dataSourceName); 
connection = dataSource.getConnection(); 

StructDescriptor structDescriptor = StructDescriptor.createDescriptor("O_SUB_MISSING", connection); 
STRUCT[] structs = new STRUCT[listPieces.size()]; 
int ind = 0; 
for (PieceEntity piece : listPieces) { 
    Object[] params = new Object[3]; 
    params[0] = piece.getActId(); 
    params[1] = piece.getGitId(); 
    params[2] = piece.getMissingQty(); 
    STRUCT struct = new STRUCT(structDescriptor, connection, params); 
    structs[ind++] = struct; 
} 
ArrayDescriptor desc = ArrayDescriptor.createDescriptor("TO_SUB_MISSING", connection); 

statement = connection.prepareCall(Constants.DECLARE_INCOMPLETE_MODUL); 
statement.registerOutParameter(1, OracleTypes.VARCHAR); 
statement.setLong(2, agmId); 
statement.setArray(3, new ARRAY(desc, connection, structs)); 
statement.executeQuery(); 

Nhưng với mã này tôi g et một ngoại lệ trên StructDescriptor.createDescriptor dòng:

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection 

tôi cố gắng để giải quyết ngoại lệ này với hai giải pháp tôi tìm thấy trên một số stackoverflow bưu điện, nhưng nó đã không làm việc.

Giải pháp 1:

OracleConnection oraConn = (OracleConnection) new DelegatingConnection(connection).getInnermostDelegate(); 

Giải pháp 2:

OracleConnection oraConn = connection.unwrap(OracleConnection.class); 

Các giải pháp đầu tiên ném ngoại lệ tương tự và ném thứ hai ngoại lệ sau đây:

java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.unwrap(Ljava/lang/Class;)Ljava/lang/Object; 

Bạn có ý tưởng về cách tôi có thể giải quyết vấn đề của mình không?

+1

Đối với giải pháp 1, bạn có đặt 'accessToUnderlyingConnectionAllowed =" true "' trong cấu hình ngữ cảnh không? –

+0

Tôi có cố gắng thêm ths trong context.xml của máy chủ tomcat của tôi: ' accessToUnderlyingConnectionAllowed đúng ' Nhưng nó không thay đổi bất cứ điều gì. – Mikael

Trả lời

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