Configurer manuellement un lien entre les objets Oracle SQL et les objets Java n'est pas une tâche triviale. En particulier, les tableaux (ou tables imbriquées) d'objets définis par l'utilisateur sont plus complexes à passer de java à Oracle que les tableaux de types de données standard. Autrement dit, il est plus simple d'appeler une procédure avec signature :
(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`
qu'une procédure dont la signature est :
(TABLE OF (NUMBER, NUMBER, NUMBER)) <- your case
Vous pouvez écrire un wrapper autour de votre procédure pour transformer le second cas en premier cas.
Cela étant dit, il n'est de loin pas impossible de cartographier votre procédure. L'exemple suivant est largement inspiré d'un billet de Tom Kyte. Tom décrit comment mapper une TABLE OF NUMBER
en utilisant oracle.sql.ARRAY
. Dans votre cas, nous devrons également utiliser oracle.sql.STRUCT
pour mapper l'IDS
Objet SQL.
Vous pouvez également parcourir la documentation Oracle JDBC, en particulier le chapitre Utilisation des types d'objets Oracle.
La première est une configuration similaire à la vôtre :
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
Voici la procédure 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
Appelons-le :
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