Saya akan berusaha keras dan mengatakan bahwa tidak ada cara langsung untuk mengakses tipe data yang dideklarasikan sebagai TABLE OF varchar(30) INDEX BY VARCHAR(30)
dari JDBC.
Dokumentasi Oracle JDBC
menyebutkan tipe elemen dari array asosiatif (yaitu varchar(30)
pertama dalam tipe Anda) di berbagai tempat, tetapi sejauh yang saya bisa lihat itu tidak mengatakan apa-apa tentang tipe data kunci. Selanjutnya, dokumentasi menyebutkan bahwa array asosiatif dilewatkan dan dikembalikan sebagai array Java. Ini membuat saya curiga bahwa Oracle JDBC hanya mendukung array asosiatif dengan BINARY_INTEGER
sebagai tipe data kunci.
Jadi, jika Anda ingin mengakses data dalam array asosiatif PL/SQL dengan VARCHAR2
kunci dari JDBC, saya akan merekomendasikan untuk mengubah data menjadi tipe data lain terlebih dahulu.
Namun, saya berharap kode JDBC yang Anda tulis akan menangani array asosiatif Anda dengan BINARY_INTEGER
kunci, setelah Anda mengubah OracleTypes.VARCHAR
untuk OracleTypes.NUMERIC
dalam panggilan Anda ke registerIndexTableOutParameter
. Ketahuilah bahwa array Java yang dikembalikan akan memiliki elemen sebanyak nilai kunci terbesar, jadi pastikan jumlah elemen maksimum (parameter kedua untuk registerIndexTableOutParameter
) cukup besar untuk ini. Pastikan juga bahwa array asosiatif tidak memiliki kunci negatif atau nol karena driver JDBC tampaknya juga tidak mendukungnya.
Untuk referensi, inilah kode yang saya gunakan untuk mendapatkan array asosiatif yang dideklarasikan sebagai INDEX BY BINARY_INTEGER
bekerja. Pertama, paket dan badan 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;
/
Kedua, kelas 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));
}
}
Ketika saya menjalankan kelas Java, saya mendapatkan output berikut:
[4, 1, null, 2, null, null, 3]