Jeg vil stikke nakken ud og sige, at der ikke er en direkte måde at få adgang til en datatype, der er erklæret som TABLE OF varchar(30) INDEX BY VARCHAR(30)
fra JDBC.
Oracle JDBC-dokumentationen
nævner elementtypen for det associative array (dvs. den første varchar(30)
i din type) forskellige steder, men så vidt jeg kan se, står der intet om nøgledatatypen. Ydermere nævner dokumentationen, at associative arrays sendes ind og returneres som Java-arrays. Dette får mig til at mistænke, at Oracle JDBC kun understøtter associative arrays med BINARY_INTEGER
som nøgledatatype.
Så hvis du vil have adgang til data i et PL/SQL associativt array med VARCHAR2
nøgler fra JDBC, vil jeg anbefale at konvertere dataene til en anden datatype først.
Jeg forventer dog, at den JDBC-kode, du har skrevet, vil håndtere dit associative array med BINARY_INTEGER
nøgler, når du ændrer OracleTypes.VARCHAR
for OracleTypes.NUMERIC
i dit opkald til registerIndexTableOutParameter
. Vær opmærksom på, at det returnerede Java-array vil have lige så mange elementer i sig som den største nøgleværdi, så sørg for, at det maksimale antal elementer (den anden parameter til registerIndexTableOutParameter
) er stor nok til dette. Sørg også for, at det associative array ikke har nogen negative eller nul-nøgler, da JDBC-driveren tilsyneladende heller ikke understøtter disse.
Til reference, her er koden, jeg brugte til at få associative arrays erklæret som INDEX BY BINARY_INTEGER
arbejder. For det første PL/SQL-pakken og brødteksten:
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;
/
For det andet Java-klassen:
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));
}
}
Når jeg kører Java-klassen, får jeg følgende output:
[4, 1, null, 2, null, null, 3]