Ще извадя врата си и ще кажа, че няма директен начин за достъп до тип данни, деклариран като TABLE OF varchar(30) INDEX BY VARCHAR(30)
от JDBC.
Документацията на Oracle JDBC
споменава типа елемент на асоциативния масив (т.е. първият varchar(30)
във вашия тип) на различни места, но доколкото мога да видя, не казва нищо за ключовия тип данни. Освен това в документацията се споменава, че асоциативните масиви се предават и връщат като Java масиви. Това ме кара да подозирам, че Oracle JDBC поддържа само асоциативни масиви с BINARY_INTEGER
като ключов тип данни.
Така че, ако искате да получите достъп до данни в PL/SQL асоциативен масив с VARCHAR2
ключове от JDBC, бих препоръчал първо да конвертирате данните в друг тип данни.
Очаквам обаче, че JDBC кодът, който сте написали, ще обработва вашия асоциативен масив с BINARY_INTEGER
ключове, след като промените OracleTypes.VARCHAR
за OracleTypes.NUMERIC
във вашето извикване към registerIndexTableOutParameter
. Имайте предвид, че върнатият Java масив ще има толкова елементи в него, колкото е най-голямата ключова стойност, така че се уверете, че максималния брой елементи (вторият параметър за registerIndexTableOutParameter
) е достатъчно голям за това. Също така се уверете, че асоциативният масив няма отрицателни или нулеви ключове, тъй като JDBC драйверът изглежда не поддържа и тях.
За справка, ето кода, който използвах, за да получа асоциативни масиви, декларирани като INDEX BY BINARY_INTEGER
работещ. Първо, 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;
/
Второ, класът на 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));
}
}
Когато стартирам Java класа, получавам следния изход:
[4, 1, null, 2, null, null, 3]