sql >> Databasteknik >  >> RDS >> Oracle

plsql - hur man returnerar associativ array till java

Jag ska sticka ut nacken och säga att det inte finns ett direkt sätt att komma åt en datatyp som deklareras som TABLE OF varchar(30) INDEX BY VARCHAR(30) från JDBC.

Oracle JDBC-dokumentationen nämner elementtypen för den associativa arrayen (dvs den första varchar(30) i din typ) på olika ställen, men såvitt jag kan se står det ingenting om nyckeldatatypen. Vidare nämner dokumentationen att associativa arrayer skickas in och returneras som Java-arrayer. Detta får mig att misstänka att Oracle JDBC endast stöder associativa arrayer med BINARY_INTEGER som nyckeldatatyp.

Så om du vill komma åt data i en PL/SQL-associativ array med VARCHAR2 nycklar från JDBC, skulle jag rekommendera att konvertera data till en annan datatyp först.

Jag förväntar mig dock att JDBC-koden du har skrivit kommer att hantera din associativa array med BINARY_INTEGER nycklar, när du ändrar OracleTypes.VARCHAR för OracleTypes.NUMERIC i ditt samtal till registerIndexTableOutParameter . Var medveten om att Java-arrayen som returneras kommer att ha lika många element i sig som det största nyckelvärdet, så se till att det maximala antalet element (den andra parametern till registerIndexTableOutParameter ) är tillräckligt stor för detta. Se också till att den associativa arrayen inte har några negativa eller nollnycklar eftersom JDBC-drivrutinen inte heller verkar stödja dessa.

För referens, här är koden jag använde för att få associativa arrayer deklarerade som INDEX BY BINARY_INTEGER arbetssätt. För det första, PL/SQL-paketet och texten:

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

För det andra, Java-klassen:

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

När jag kör Java-klassen får jag följande utdata:

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



  1. hur anpassar man "visa processlista" i mysql?

  2. FLOT-data från MySQL via PHP?

  3. Hur beställer man efter en SUM() i MySQL?

  4. MySQL - JDBC - SELECT och DELETE samtidigt