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?
Für Lösung 1 haben Sie 'accessToUnderlyingConnectionAllowed =" true "' im Kontext config? –
Ich habe versuchen ths im context.xml meines Tomcatbediener hinzuzufügen: ' accessToUnderlyingConnectionAllowed wahr ' Aber es hat nichts ändern. –
Mikael