Menyiapkan tautan antara objek Oracle SQL dan objek Java secara manual bukanlah tugas yang sepele. Secara khusus, array (atau tabel bersarang) dari objek yang ditentukan pengguna lebih kompleks untuk diteruskan dari java ke Oracle daripada array tipe data standar. Dengan kata lain, lebih mudah untuk memanggil prosedur dengan tanda tangan:
(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`
dari prosedur yang tanda tangannya adalah:
(TABLE OF (NUMBER, NUMBER, NUMBER)) <- your case
Anda dapat menulis pembungkus di sekitar prosedur Anda untuk mengubah kasus kedua menjadi kasus pertama.
Meskipun demikian, sejauh ini bukan tidak mungkin untuk memetakan prosedur Anda. Contoh berikut sebagian besar terinspirasi oleh posting oleh Tom Kyte. Tom menjelaskan cara memetakan TABLE OF NUMBER
menggunakan oracle.sql.ARRAY
. Dalam kasus Anda, kami juga harus menggunakan oracle.sql.STRUCT
untuk memetakan IDS
objek SQL.
Anda mungkin juga ingin menelusuri dokumen Oracle JDBC, khususnya bab Bekerja dengan Tipe Objek Oracle.
Pertama adalah pengaturan yang mirip dengan Anda:
SQL> CREATE OR REPLACE TYPE IDS AS OBJECT ( id1 NUMBER, id2 NUMBER, id3 NUMBER );
2 /
Type created
SQL> CREATE OR REPLACE TYPE IDS_TABLE AS TABLE OF IDS;
2 /
Type created
SQL> CREATE OR REPLACE PROCEDURE getInfo(p_ids IN IDS_TABLE) IS
2 BEGIN
3 FOR i IN 1 .. p_ids.COUNT LOOP
4 dbms_output.put_line(p_ids(i).id1
5 || ',' || p_ids(i).id2
6 || ',' || p_ids(i).id3);
7 END LOOP;
8 END getInfo;
9 /
Procedure created
Ini adalah prosedur java:
SQL> CREATE OR REPLACE
2 AND COMPILE JAVA SOURCE NAMED "ArrayDemo"
3 as
4 import java.io.*;
5 import java.sql.*;
6 import oracle.sql.*;
7 import oracle.jdbc.driver.*;
8
9 public class ArrayDemo {
10
11 public static void passArray() throws SQLException {
12
13 Connection conn =
14 new OracleDriver().defaultConnection();
15
16
17 StructDescriptor itemDescriptor =
18 StructDescriptor.createDescriptor("IDS",conn);
19
20 Object[] itemAtributes = new Object[] {new Integer(1),
21 new Integer(2),
22 new Integer(3)};
23 STRUCT itemObject1 = new STRUCT(itemDescriptor,conn,itemAtributes);
24
25 itemAtributes = new Object[] {new Integer(4),
26 new Integer(5),
27 new Integer(6)};
28 STRUCT itemObject2 = new STRUCT(itemDescriptor,conn,itemAtributes);
29
30 STRUCT[] idsArray = {itemObject1,itemObject2};
31
32 ArrayDescriptor descriptor =
33 ArrayDescriptor.createDescriptor( "IDS_TABLE", conn );
34
35 ARRAY array_to_pass =
36 new ARRAY( descriptor, conn, idsArray );
37
38 OraclePreparedStatement ps =
39 (OraclePreparedStatement)conn.prepareStatement
40 ( "begin getInfo(:x); end;" );
41
42 ps.setARRAY( 1, array_to_pass );
43 ps.execute();
44
45 }
46 }
47 /
Java created
Sebut saja:
SQL> CREATE OR REPLACE
2 PROCEDURE show_java_calling_plsql
3 AS LANGUAGE JAVA
4 NAME 'ArrayDemo.passArray()';
5 /
Procedure created
SQL> exec show_java_calling_plsql ;
1,2,3
4,5,6
PL/SQL procedure successfully completed