Oracle
 sql >> Base de données >  >> RDS >> Oracle

plsql - comment retourner un tableau associatif à java

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]