Gebruik geen associatieve array - gebruik een verzameling:
CREATE TYPE StringArray IS TABLE OF VARCHAR2(4000);
CREATE TYPE CLOBArray IS TABLE OF CLOB;
Dan kun je het volgende doen:
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
}
}
Als u een PL/SQL-associatieve array als invoer voor uw procedure moet gebruiken, schrijf dan een functie die een verzameling nodig heeft en een associatieve array van het juiste type uitvoert en roep die dan aan:
BEGIN TEST.UPPER( TO_ASSOC_ARRAY( :in_collection ), :out_array ); END;
Opmerking:dit antwoord gaat uit van het gebruik van de Oracle-driver in ojdbc6.jar die niet de OracleConnection.createOracleArray()
lijkt te hebben methode, maar het zal, hopelijk, draagbaar zijn om oracle.sql.ARRAY
te veranderen naar java.sql.Array
en met behulp van de nieuwere methoden.