Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie rufe ich eine gespeicherte Oracle-Prozedur auf, die einen benutzerdefinierten Typ in Java enthält?

Das manuelle Einrichten einer Verknüpfung zwischen Oracle SQL-Objekten und Java-Objekten ist keine triviale Aufgabe. Insbesondere Arrays (oder verschachtelte Tabellen) von benutzerdefinierten Objekten sind komplexer von Java an Oracle zu übergeben als Arrays von Standarddatentypen. Mit anderen Worten, es ist einfacher, eine Prozedur mit Signatur aufzurufen:

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

als eine Prozedur, deren Signatur ist:

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

Sie können einen Wrapper um Ihre Prozedur schreiben, um den zweiten Fall in den ersten Fall umzuwandeln.

Davon abgesehen ist es bei weitem nicht unmöglich, Ihren Vorgang abzubilden. Das folgende Beispiel ist weitgehend von einem Beitrag von Tom Kyte inspiriert. Tom beschreibt, wie man eine TABLE OF NUMBER abbildet mit oracle.sql.ARRAY . In Ihrem Fall müssen wir auch oracle.sql.STRUCT verwenden um die IDS zuzuordnen SQL-Objekt.

Sie können auch das Oracle JDBC-Dokument durchsuchen, insbesondere das Kapitel Working with Oracle Object Types.

Zuerst ist ein ähnliches Setup wie bei Ihnen:

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

Dies ist die Java-Prozedur:

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

Nennen wir es:

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