Je vais tendre la main et dire qu'il n'y a pas de moyen direct d'accéder à un type de données déclaré comme TABLE OF varchar(30) INDEX BY VARCHAR(30)
de JDBC.
La documentation Oracle JDBC
mentionne le type d'élément du tableau associatif (c'est-à-dire le premier varchar(30)
dans votre type) à divers endroits, mais pour autant que je sache, cela ne dit rien sur le type de données clé. De plus, la documentation mentionne que les tableaux associatifs sont transmis et renvoyés sous forme de tableaux Java. Cela m'amène à soupçonner qu'Oracle JDBC ne prend en charge que les tableaux associatifs avec BINARY_INTEGER
comme type de données clé.
Donc, si vous voulez accéder aux données dans un tableau associatif PL/SQL avec VARCHAR2
clés de JDBC, je vous recommande de convertir d'abord les données dans un autre type de données.
Cependant, je m'attendrais à ce que le code JDBC que vous avez écrit gère votre tableau associatif avec BINARY_INTEGER
clés, une fois que vous modifiez OracleTypes.VARCHAR
pour OracleTypes.NUMERIC
dans votre appel à registerIndexTableOutParameter
. Sachez que le tableau Java renvoyé contiendra autant d'éléments que la plus grande valeur de clé, assurez-vous donc que le nombre maximal d'éléments (le deuxième paramètre de registerIndexTableOutParameter
) est assez grand pour cela. Assurez-vous également que le tableau associatif n'a pas de clés négatives ou nulles car le pilote JDBC semble ne pas les prendre en charge non plus.
Pour référence, voici le code que j'ai utilisé pour obtenir des tableaux associatifs déclarés comme INDEX BY BINARY_INTEGER
travail. Tout d'abord, le package PL/SQL et le corps :
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;
/
Deuxièmement, la classe Java :
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));
}
}
Lorsque j'exécute la classe Java, j'obtiens le résultat suivant :
[4, 1, null, 2, null, null, 3]