Oracle
 sql >> база данни >  >> RDS >> Oracle

plsql - как да върна асоциативен масив на java

Ще извадя врата си и ще кажа, че няма директен начин за достъп до тип данни, деклариран като 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]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. В Oracle възможно ли е да се преобразува много голям низ (clob), разделен със запетая, в таблица с по-добра производителност

  2. Как да създадете работа, когато job_action трябва да извика процедура с параметър CLOB

  3. Oracle trimspool само завършващи празни места (без водещи празни места)

  4. Как да видите типа на променлива в PL/SQL динамично?

  5. Oracle:импортиране на записи от разделен с разделители текстов файл в база данни с помощта на pl-sql