sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo llamar al procedimiento almacenado de Oracle que incluye el tipo definido por el usuario en Java?

Configurar un enlace entre objetos Oracle SQL y objetos Java manualmente no es una tarea trivial. En particular, las matrices (o tablas anidadas) de objetos definidos por el usuario son más complejas de pasar de Java a Oracle que las matrices de tipos de datos estándar. En otras palabras, es más fácil llamar a un procedimiento con firma:

(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`

que un procedimiento cuya firma es:

(TABLE OF (NUMBER, NUMBER, NUMBER))   <- your case

Puede escribir un contenedor alrededor de su procedimiento para transformar el segundo caso en el primer caso.

Dicho esto, de lejos no es imposible mapear su procedimiento. El siguiente ejemplo está inspirado en gran medida en una publicación de Tom Kyte. Tom describe cómo mapear una TABLE OF NUMBER usando oracle.sql.ARRAY . En tu caso también tendremos que usar oracle.sql.STRUCT para mapear el IDS Objeto SQL.

También puede consultar el documento de Oracle JDBC, en particular el capítulo Trabajar con tipos de objetos de Oracle.

La primera es una configuración similar a la tuya:

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

Este es el procedimiento 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

Llamémoslo:

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