sql >> Database >  >> RDS >> Oracle

plsql - hoe associatieve array terug te sturen naar java

Ik ga mijn nek uitsteken en zeggen dat er geen directe manier is om toegang te krijgen tot een datatype dat is gedeclareerd als TABLE OF varchar(30) INDEX BY VARCHAR(30) van JDBC.

De Oracle JDBC-documentatie vermeldt het elementtype van de associatieve array (d.w.z. de eerste varchar(30) in jouw type) op verschillende plaatsen, maar voor zover ik kan zien zegt het niets over het belangrijkste datatype. Verder vermeldt de documentatie dat associatieve arrays worden doorgegeven en geretourneerd als Java-arrays. Dit doet me vermoeden dat Oracle JDBC alleen associatieve arrays ondersteunt met BINARY_INTEGER als het belangrijkste datatype.

Dus als u toegang wilt tot gegevens in een PL/SQL associatieve array met VARCHAR2 sleutels van JDBC, raad ik aan de gegevens eerst naar een ander gegevenstype te converteren.

Ik zou echter verwachten dat de JDBC-code die u hebt geschreven uw associatieve array met BINARY_INTEGER zal verwerken sleutels, zodra u OracleTypes.VARCHAR . wijzigt voor OracleTypes.NUMERIC in uw aanroep naar registerIndexTableOutParameter . Houd er rekening mee dat de geretourneerde Java-array evenveel elementen bevat als de grootste sleutelwaarde, dus zorg ervoor dat het maximale aantal elementen (de tweede parameter voor registerIndexTableOutParameter ) is hiervoor groot genoeg. Zorg er ook voor dat de associatieve array geen negatieve of nul-sleutels heeft, aangezien het JDBC-stuurprogramma deze ook niet lijkt te ondersteunen.

Ter referentie, hier is de code die ik heb gebruikt om associatieve arrays te krijgen gedeclareerd als INDEX BY BINARY_INTEGER werken. Ten eerste, het PL/SQL-pakket en de hoofdtekst:

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;
/

Ten tweede, de Java-klasse:

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));
    }
}

Wanneer ik de Java-klasse uitvoer, krijg ik de volgende uitvoer:

[4, 1, null, 2, null, null, 3]



  1. afbeelding bewerken met invoerbestandstype

  2. MijnSQL:DATE_ADD

  3. Draaien ongedaan maken met kolomnaam

  4. Toegang tot docker-container mysql-databases