Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

plsql - cara mengembalikan array asosiatif ke java

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]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Saya perlu menyimpan kode pos dalam database. Berapa besar kolom yang seharusnya?

  2. Perlu menemukan hari kerja berikutnya dan sebelumnya di oracle

  3. Oracle SQL:Memilih data dan nama partisi dari tabel dan memotong partisi

  4. ATAU Database/Ketik di Oracle Express/SQL Developer

  5. Bagaimana cara membatasi jumlah baris yang dikembalikan oleh LEFT JOIN ini menjadi satu?