sql >> Databáze >  >> RDS >> Oracle

plsql - jak vrátit asociativní pole do Java

Vystrčím krk a řeknu, že neexistuje přímý způsob přístupu k datovému typu deklarovanému jako TABLE OF varchar(30) INDEX BY VARCHAR(30) z JDBC.

Dokumentace Oracle JDBC zmiňuje typ prvku asociativního pole (tj. první varchar(30) ve vašem typu) na různých místech, ale pokud vidím, neříká to nic o datovém typu klíče. Kromě toho dokumentace uvádí, že asociativní pole jsou předávána a vrácena jako pole Java. To mě vede k podezření, že Oracle JDBC podporuje pouze asociativní pole s BINARY_INTEGER jako klíčový datový typ.

Pokud tedy chcete přistupovat k datům v asociativním poli PL/SQL pomocí VARCHAR2 klíčů z JDBC, doporučuji nejprve převést data na jiný datový typ.

Očekával bych však, že kód JDBC, který jste napsali, bude zpracovávat vaše asociativní pole s BINARY_INTEGER klíče, jakmile změníte OracleTypes.VARCHAR pro OracleTypes.NUMERIC ve vašem volání registerIndexTableOutParameter . Uvědomte si, že vrácené pole Java bude mít tolik prvků, jako je největší hodnota klíče, takže zajistěte, aby byl maximální počet prvků (druhý parametr registerIndexTableOutParameter ) je na to dostatečně velký. Také se ujistěte, že asociativní pole nemá žádné záporné nebo nulové klíče, protože se zdá, že je nepodporuje ani ovladač JDBC.

Pro informaci zde je kód, který jsem použil k získání asociativních polí deklarovaných jako INDEX BY BINARY_INTEGER pracovní. Za prvé, balíček a tělo 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;
/

Za druhé, třída 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));
    }
}

Když spustím třídu Java, dostanu následující výstup:

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



  1. Jak implementovat INSERT ON DUPLICATE KEY UPDATE aka upsert v CakePHP 3?

  2. Přístup k souborovému DSN z Java

  3. Nelze načíst požadovanou třídu:com.mysql.jdbc.Driver na JBoss pomocí režimu Hibernate

  4. Oracle Apex:postupný přístup k vytváření přepínačů v interaktivní sestavě