Bạn không thể truy cập các đối tượng PLSQL (trường hợp 2 &5 =đối tượng cấp gói) từ java, hãy xem "java - truyền mảng trong thủ tục được lưu trữ oracle". Tuy nhiên, bạn có thể truy cập các kiểu SQL (trường hợp 1 và 4).
Để nhận các tham số OUT từ PL / SQL sang java, bạn có thể sử dụng phương pháp được mô tả trong một trong các chuỗi của Tom Kyte bằng cách sử dụng OracleCallableStatement. Mã của bạn sẽ có một bước bổ sung vì bạn đang truy xuất bảng Đối tượng thay vì bảng VARCHAR.
Đây là bản demo sử dụng Table of SQL Object, trước tiên hãy thiết lập:
SQL> CREATE TYPE t_type AS OBJECT (val VARCHAR(4));
2 /
Type created
SQL> CREATE TYPE t_table AS TABLE OF t_type;
2 /
Type created
SQL> CREATE OR REPLACE PROCEDURE p_sql_type (p_out OUT t_table) IS
2 BEGIN
3 p_out := t_table(t_type('a'), t_type('b'));
4 END;
5 /
Procedure created
Lớp java thực tế (sử dụng dbms_output.put_line
để ghi nhật ký vì tôi sẽ gọi nó từ SQL, hãy sử dụng System.out.println
nếu được gọi từ java):
SQL> CREATE OR REPLACE
2 AND COMPILE JAVA SOURCE NAMED "ArrayDemo"
3 as
4 import java.sql.*;
5 import oracle.sql.*;
6 import oracle.jdbc.driver.*;
7
8 public class ArrayDemo {
9
10 private static void log(String s) throws SQLException {
11 PreparedStatement ps =
12 new OracleDriver().defaultConnection().prepareStatement
13 ( "begin dbms_output.put_line(:x); end;" );
14 ps.setString(1, s);
15 ps.execute();
16 ps.close();
17 }
18
19 public static void getArray() throws SQLException {
20
21 Connection conn = new OracleDriver().defaultConnection();
22
23 OracleCallableStatement cs =
24 (OracleCallableStatement)conn.prepareCall
25 ( "begin p_sql_type(?); end;" );
26 cs.registerOutParameter(1, OracleTypes.ARRAY, "T_TABLE");
27 cs.execute();
28 ARRAY array_to_pass = cs.getARRAY(1);
29
30 /*showing content*/
31 Datum[] elements = array_to_pass.getOracleArray();
32
33 for (int i=0;i<elements.length;i++){
34 Object[] element = ((STRUCT) elements[i]).getAttributes();
35 String value = (String)element[0];
36 log("array(" + i + ").val=" + value);
37 }
38 }
39 }
40 /
Java created
Hãy gọi nó là:
SQL> CREATE OR REPLACE
2 PROCEDURE show_java_calling_plsql
3 AS LANGUAGE JAVA
4 NAME 'ArrayDemo.getArray()';
5 /
Procedure created
SQL> EXEC show_java_calling_plsql;
array(0).val=a
array(1).val=b