Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

plsql - cách trả về mảng kết hợp cho java

Tôi sẽ thò cổ ra và nói rằng không có cách nào trực tiếp để truy cập vào một kiểu dữ liệu được khai báo là TABLE OF varchar(30) INDEX BY VARCHAR(30) từ JDBC.

Tài liệu Oracle JDBC đề cập đến loại phần tử của mảng kết hợp (tức là varchar(30) đầu tiên trong loại của bạn) ở nhiều nơi khác nhau, nhưng theo tôi thấy thì nó không nói gì về kiểu dữ liệu khóa. Hơn nữa, tài liệu đề cập rằng các mảng kết hợp được chuyển vào và trả về dưới dạng các mảng Java. Điều này khiến tôi nghi ngờ rằng Oracle JDBC chỉ hỗ trợ các mảng liên kết với BINARY_INTEGER làm kiểu dữ liệu chính.

Vì vậy, nếu bạn muốn truy cập dữ liệu trong mảng liên kết PL / SQL với VARCHAR2 từ JDBC, trước tiên tôi khuyên bạn nên chuyển đổi dữ liệu thành một kiểu dữ liệu khác.

Tuy nhiên, tôi hy vọng rằng mã JDBC bạn đã viết sẽ xử lý mảng liên kết của bạn với BINARY_INTEGER sau khi bạn thay đổi OracleTypes.VARCHAR cho OracleTypes.NUMERIC trong cuộc gọi của bạn tới registerIndexTableOutParameter . Lưu ý rằng mảng Java được trả về sẽ có bao nhiêu phần tử trong đó là giá trị khóa lớn nhất, vì vậy hãy đảm bảo rằng số phần tử tối đa (tham số thứ hai cho registerIndexTableOutParameter ) đủ lớn cho việc này. Ngoài ra, hãy đảm bảo rằng mảng kết hợp không có khóa âm hoặc 0 vì trình điều khiển JDBC dường như cũng không hỗ trợ những khóa này.

Để tham khảo, đây là mã tôi đã sử dụng để lấy các mảng kết hợp được khai báo là INDEX BY BINARY_INTEGER đang làm việc. Thứ nhất, gói và nội dung 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;
/

Thứ hai, lớp 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));
    }
}

Khi tôi chạy lớp Java, tôi nhận được kết quả sau:

[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. Máy khách Oracle yêu cầu dấu ngoặc đơn xung quanh tên cột?

  2. ORA-30076:trường trích xuất không hợp lệ cho nguồn trích xuất

  3. Một ký tự không phải số được tìm thấy ở vị trí số được mong đợi

  4. Oracle:Làm thế nào để biết được có một giao dịch đang chờ xử lý hay không?

  5. Làm cách nào để truy vấn định dạng ngày YYYY-MM-dd HH-MM-ss?