Verwenden Sie kein assoziatives Array – verwenden Sie eine Sammlung:
CREATE TYPE StringArray IS TABLE OF VARCHAR2(4000);
CREATE TYPE CLOBArray IS TABLE OF CLOB;
Dann können Sie Folgendes tun:
public void testString(Connection connection) {
String[] values = { "alpha", "beta", "gamma" };
try {
OracleConnection oc = (OracleConnection) connection;
ARRAY stringArray = oc.createARRAY( "STRINGARRAY", values ); // Upper case identifier
OracleCallableStatement st = (OracleCallableStatement) oc.prepareCall(
"begin test.upper( :in_array, :out_array ); end;"
);
st.setARRAYAtName( "in_array", stringArray );
st.registerOutParameter( "out_array", Types.ARRAY, "STRINGARRAY"); // Upper case again
st.execute();
String[] result = (String[])st.getARRAY( 2 ).getArray();
System.out.println("Length: " + result.length);
System.out.println("First: " + result[0]);
} (catch SQLException e) {
// Handle error
}
}
Wenn Sie ein assoziatives PL/SQL-Array als Eingabe für Ihre Prozedur verwenden müssen, schreiben Sie eine Funktion, die eine Sammlung übernimmt und ein assoziatives Array des entsprechenden Typs ausgibt, und rufen Sie diese dann auf:
BEGIN TEST.UPPER( TO_ASSOC_ARRAY( :in_collection ), :out_array ); END;
Hinweis:Diese Antwort geht davon aus, dass der Oracle-Treiber in ojdbc6.jar verwendet wird, der anscheinend nicht über OracleConnection.createOracleArray()
verfügt Methode, aber es wird hoffentlich portabel sein, indem Sie oracle.sql.ARRAY
ändern zu java.sql.Array
und mit den neueren Methoden.