Voy a arriesgarme y decir que no hay una forma directa de acceder a un tipo de datos declarado como TABLE OF varchar(30) INDEX BY VARCHAR(30)
de JDBC.
La documentación de Oracle JDBC
menciona el tipo de elemento de la matriz asociativa (es decir, el primer varchar(30)
en su tipo) en varios lugares, pero por lo que puedo ver, no dice nada sobre el tipo de datos clave. Además, la documentación menciona que las matrices asociativas se pasan y se devuelven como matrices Java. Esto me lleva a sospechar que Oracle JDBC solo admite matrices asociativas con BINARY_INTEGER
como el tipo de datos clave.
Entonces, si desea acceder a los datos en una matriz asociativa PL/SQL con VARCHAR2
claves de JDBC, recomendaría convertir los datos a otro tipo de datos primero.
Sin embargo, esperaría que el código JDBC que ha escrito maneje su matriz asociativa con BINARY_INTEGER
claves, una vez que cambie OracleTypes.VARCHAR
para OracleTypes.NUMERIC
en su llamada a registerIndexTableOutParameter
. Tenga en cuenta que la matriz Java devuelta tendrá tantos elementos como el valor de clave más grande, así que asegúrese de que la cantidad máxima de elementos (el segundo parámetro para registerIndexTableOutParameter
) es lo suficientemente grande para esto. También asegúrese de que la matriz asociativa no tenga claves negativas o cero, ya que el controlador JDBC parece no admitirlas tampoco.
Como referencia, aquí está el código que usé para obtener matrices asociativas declaradas como INDEX BY BINARY_INTEGER
laboral. En primer lugar, el paquete y el cuerpo de PL/SQL:
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;
/
En segundo lugar, la clase 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));
}
}
Cuando ejecuto la clase Java, obtengo el siguiente resultado:
[4, 1, null, 2, null, null, 3]