Jag ska sticka ut nacken och säga att det inte finns ett direkt sätt att komma åt en datatyp som deklareras som TABLE OF varchar(30) INDEX BY VARCHAR(30)
från JDBC.
Oracle JDBC-dokumentationen
nämner elementtypen för den associativa arrayen (dvs den första varchar(30)
i din typ) på olika ställen, men såvitt jag kan se står det ingenting om nyckeldatatypen. Vidare nämner dokumentationen att associativa arrayer skickas in och returneras som Java-arrayer. Detta får mig att misstänka att Oracle JDBC endast stöder associativa arrayer med BINARY_INTEGER
som nyckeldatatyp.
Så om du vill komma åt data i en PL/SQL-associativ array med VARCHAR2
nycklar från JDBC, skulle jag rekommendera att konvertera data till en annan datatyp först.
Jag förväntar mig dock att JDBC-koden du har skrivit kommer att hantera din associativa array med BINARY_INTEGER
nycklar, när du ändrar OracleTypes.VARCHAR
för OracleTypes.NUMERIC
i ditt samtal till registerIndexTableOutParameter
. Var medveten om att Java-arrayen som returneras kommer att ha lika många element i sig som det största nyckelvärdet, så se till att det maximala antalet element (den andra parametern till registerIndexTableOutParameter
) är tillräckligt stor för detta. Se också till att den associativa arrayen inte har några negativa eller nollnycklar eftersom JDBC-drivrutinen inte heller verkar stödja dessa.
För referens, här är koden jag använde för att få associativa arrayer deklarerade som INDEX BY BINARY_INTEGER
arbetssätt. För det första, PL/SQL-paketet och texten:
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;
/
För det andra, 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 jag kör Java-klassen får jag följande utdata:
[4, 1, null, 2, null, null, 3]