2013-07-08 4 views
5

Ich habe eine komplexe PL/SQL gespeicherte Funktion und ich muss diese Funktion in JAVA aufrufen. Hier ist das Verfahren:JDBC Aufruf an Oracle Stored Function - IN Parameter vom Typ "Tabelle der Struktur"

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

So, wie Sie hier sehen können, die Art meines zweiten Parameter ist TO_SUB_MISSING, die eine Tabelle von O_SUB_MISSING ist:

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); 

Nach einigen Erforschungen Ich schreibe diesen Code:

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(); 

Aber mit diesem Code I g et eine Ausnahme auf der StructDescriptor.createDescriptor Linie:

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

Ich versuche, diese Ausnahme mit zwei Lösungen zu lösen ich auf einige Stackoverflow Post finden, aber es hat nicht funktioniert.

Lösung 1:

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

Lösung 2:

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

Die erste Lösung die gleiche Ausnahme auslösen und den zweiten Wurf der folgenden Ausnahme:

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

Haben Sie eine Idee, wie ich mein Problem lösen kann?

+1

Für Lösung 1 haben Sie 'accessToUnderlyingConnectionAllowed =" true "' im Kontext config? –

+0

Ich habe versuchen ths im context.xml meines Tomcatbediener hinzuzufügen: ' accessToUnderlyingConnectionAllowed wahr ' Aber es hat nichts ändern. – Mikael

Antwort

Verwandte Themen