Het handmatig opzetten van een koppeling tussen Oracle SQL-objecten en Java-objecten is geen triviale taak. Met name arrays (of geneste tabellen) van door de gebruiker gedefinieerde objecten zijn ingewikkelder om van Java naar Oracle te gaan dan arrays van standaard datatypes. Met andere woorden, het is gemakkelijker om een procedure met handtekening op te roepen:
(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`
dan een procedure waarvan de handtekening is:
(TABLE OF (NUMBER, NUMBER, NUMBER)) <- your case
U kunt een wikkel rond uw procedure schrijven om het tweede geval om te zetten in het eerste geval.
Dat gezegd hebbende, is het bij lange na niet onmogelijk om uw procedure in kaart te brengen. Het volgende voorbeeld is grotendeels geïnspireerd op een bericht van Tom Kyte. Tom beschrijft hoe je een TABLE OF NUMBER
met behulp van oracle.sql.ARRAY
. In jouw geval zullen we ook oracle.sql.STRUCT
. moeten gebruiken om de IDS
in kaart te brengen SQL-object.
U kunt ook door het Oracle JDBC-document bladeren, met name het hoofdstuk Werken met Oracle-objecttypen.
De eerste is een configuratie die vergelijkbaar is met die van jou:
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
Dit is de Java-procedure:
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
Laten we het noemen:
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