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]