Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como chamar o procedimento armazenado oracle que inclui o tipo definido pelo usuário em java?


Configurar um link entre objetos Oracle SQL e objetos Java manualmente não é uma tarefa trivial. Em particular, arrays (ou tabelas aninhadas) de objetos definidos pelo usuário são mais complexos para passar de java para Oracle do que arrays de tipos de dados padrão. Em outras palavras, é mais fácil chamar um procedimento com assinatura:
(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`

do que um procedimento cuja assinatura seja:
(TABLE OF (NUMBER, NUMBER, NUMBER))   <- your case

Você pode escrever um wrapper em torno de seu procedimento para transformar o segundo caso no primeiro caso.

Dito isto, não é de longe impossível mapear seu procedimento. O exemplo a seguir é amplamente inspirado por um post de Tom Kyte. Tom descreve como mapear uma TABLE OF NUMBER usando oracle.sql.ARRAY . No seu caso também teremos que usar oracle.sql.STRUCT para mapear o IDS objeto SQL.

Você também pode procurar o documento Oracle JDBC, em particular o capítulo Trabalhando com Tipos de Objeto Oracle.

Primeiro é uma configuração semelhante à sua:
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 é o procedimento 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

Vamos chamá-lo:
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