Ik ga mijn nek uitsteken en zeggen dat er geen directe manier is om toegang te krijgen tot een datatype dat is gedeclareerd als TABLE OF varchar(30) INDEX BY VARCHAR(30)
van JDBC.
De Oracle JDBC-documentatie
vermeldt het elementtype van de associatieve array (d.w.z. de eerste varchar(30)
in jouw type) op verschillende plaatsen, maar voor zover ik kan zien zegt het niets over het belangrijkste datatype. Verder vermeldt de documentatie dat associatieve arrays worden doorgegeven en geretourneerd als Java-arrays. Dit doet me vermoeden dat Oracle JDBC alleen associatieve arrays ondersteunt met BINARY_INTEGER
als het belangrijkste datatype.
Dus als u toegang wilt tot gegevens in een PL/SQL associatieve array met VARCHAR2
sleutels van JDBC, raad ik aan de gegevens eerst naar een ander gegevenstype te converteren.
Ik zou echter verwachten dat de JDBC-code die u hebt geschreven uw associatieve array met BINARY_INTEGER
zal verwerken sleutels, zodra u OracleTypes.VARCHAR
. wijzigt voor OracleTypes.NUMERIC
in uw aanroep naar registerIndexTableOutParameter
. Houd er rekening mee dat de geretourneerde Java-array evenveel elementen bevat als de grootste sleutelwaarde, dus zorg ervoor dat het maximale aantal elementen (de tweede parameter voor registerIndexTableOutParameter
) is hiervoor groot genoeg. Zorg er ook voor dat de associatieve array geen negatieve of nul-sleutels heeft, aangezien het JDBC-stuurprogramma deze ook niet lijkt te ondersteunen.
Ter referentie, hier is de code die ik heb gebruikt om associatieve arrays te krijgen gedeclareerd als INDEX BY BINARY_INTEGER
werken. Ten eerste, het PL/SQL-pakket en de hoofdtekst:
create or replace PACKAGE testLookAside as
type AssocArry IS TABLE OF number INDEX BY binary_integer;
function lookupMasterData return AssocArry;
end testLookAside;
/
create or replace PACKAGE BODY testLookAside as
function lookupMasterData return AssocArry as
retval AssocArry;
begin
retval(2) := 1;
retval(4) := 2;
retval(7) := 3;
retval(1) := 4;
return retval;
end lookupMasterData;
end testLookAside;
/
Ten tweede, de Java-klasse:
import java.math.BigDecimal;
import java.sql.*;
import java.util.Arrays;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
public class AssocArrayTest {
public static void main(String[] args) throws Exception {
Connection c = DriverManager.getConnection("url", "user", "password");
OracleCallableStatement s = (OracleCallableStatement)c.prepareCall("{? = call testLookAside.lookupMasterData }");
s.registerIndexTableOutParameter(1, 30, OracleTypes.NUMERIC, 0);
s.execute();
BigDecimal[] data = (BigDecimal[])s.getPlsqlIndexTable(1);
System.out.println(Arrays.toString(data));
}
}
Wanneer ik de Java-klasse uitvoer, krijg ik de volgende uitvoer:
[4, 1, null, 2, null, null, 3]