Opsætning af et link mellem Oracle SQL-objekter og java-objekter manuelt er ikke en triviel opgave. Især arrays (eller indlejrede tabeller) af brugerdefinerede objekter er mere komplekse at overføre fra java til Oracle end arrays af standarddatatyper. Det er med andre ord nemmere at kalde en procedure med signatur:
(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`
end en procedure, hvis underskrift er:
(TABLE OF (NUMBER, NUMBER, NUMBER)) <- your case
Du kan skrive en indpakning omkring din procedure for at omdanne den anden sag til den første sag.
Når det så er sagt, er det langtfra umuligt at kortlægge din procedure. Det følgende eksempel er i høj grad inspireret af et indlæg af Tom Kyte. Tom beskriver, hvordan man kortlægger en TABLE OF NUMBER
ved hjælp af oracle.sql.ARRAY
. I dit tilfælde bliver vi også nødt til at bruge oracle.sql.STRUCT
for at kortlægge IDS
SQL-objekt.
Du vil måske også gennemse Oracle JDBC-dokumentet, især kapitlet Arbejde med Oracle-objekttyper.
Først er en opsætning, der ligner din:
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
Dette er java-proceduren:
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
Lad os kalde det:
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