sql >> Base de Datos >  >> RDS >> Oracle

plsql - cómo devolver una matriz asociativa a Java

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]