sql >> Database teknologi >  >> RDS >> Oracle

plsql - hvordan man returnerer associative array til java

Jeg vil stikke nakken ud og sige, at der ikke er en direkte måde at få adgang til en datatype, der er erklæret som TABLE OF varchar(30) INDEX BY VARCHAR(30) fra JDBC.

Oracle JDBC-dokumentationen nævner elementtypen for det associative array (dvs. den første varchar(30) i din type) forskellige steder, men så vidt jeg kan se, står der intet om nøgledatatypen. Ydermere nævner dokumentationen, at associative arrays sendes ind og returneres som Java-arrays. Dette får mig til at mistænke, at Oracle JDBC kun understøtter associative arrays med BINARY_INTEGER som nøgledatatype.

Så hvis du vil have adgang til data i et PL/SQL associativt array med VARCHAR2 nøgler fra JDBC, vil jeg anbefale at konvertere dataene til en anden datatype først.

Jeg forventer dog, at den JDBC-kode, du har skrevet, vil håndtere dit associative array med BINARY_INTEGER nøgler, når du ændrer OracleTypes.VARCHAR for OracleTypes.NUMERIC i dit opkald til registerIndexTableOutParameter . Vær opmærksom på, at det returnerede Java-array vil have lige så mange elementer i sig som den største nøgleværdi, så sørg for, at det maksimale antal elementer (den anden parameter til registerIndexTableOutParameter ) er stor nok til dette. Sørg også for, at det associative array ikke har nogen negative eller nul-nøgler, da JDBC-driveren tilsyneladende heller ikke understøtter disse.

Til reference, her er koden, jeg brugte til at få associative arrays erklæret som INDEX BY BINARY_INTEGER arbejder. For det første PL/SQL-pakken og brødteksten:

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

For det andet 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 jeg kører Java-klassen, får jeg følgende output:

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



  1. tilslut mysql til postgresql

  2. Room Migration Alter Tabel tilføjer ikke ny kolonne og migrerer bliver kaldt igen og igen

  3. Hvad er bedste praksis for at forhindre SQL-injektion i node-mysql?

  4. PostgreSQL ANSI, Python SQL, utf-8' codec kan ikke afkode byte 0xa0