Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment appeler une procédure stockée oracle qui inclut un type défini par l'utilisateur en Java?

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