sql >> Database >  >> RDS >> Oracle

Hoe een Oracle-opgeslagen procedure aan te roepen die een door de gebruiker gedefinieerd type in Java bevat?

Het handmatig opzetten van een koppeling tussen Oracle SQL-objecten en Java-objecten is geen triviale taak. Met name arrays (of geneste tabellen) van door de gebruiker gedefinieerde objecten zijn ingewikkelder om van Java naar Oracle te gaan dan arrays van standaard datatypes. Met andere woorden, het is gemakkelijker om een ​​procedure met handtekening op te roepen:

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

dan een procedure waarvan de handtekening is:

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

U kunt een wikkel rond uw procedure schrijven om het tweede geval om te zetten in het eerste geval.

Dat gezegd hebbende, is het bij lange na niet onmogelijk om uw procedure in kaart te brengen. Het volgende voorbeeld is grotendeels geïnspireerd op een bericht van Tom Kyte. Tom beschrijft hoe je een TABLE OF NUMBER met behulp van oracle.sql.ARRAY . In jouw geval zullen we ook oracle.sql.STRUCT . moeten gebruiken om de IDS in kaart te brengen SQL-object.

U kunt ook door het Oracle JDBC-document bladeren, met name het hoofdstuk Werken met Oracle-objecttypen.

De eerste is een configuratie die vergelijkbaar is met die van jou:

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

Dit is de Java-procedure:

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

Laten we het noemen:

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


  1. Hoe de LOCATE()-functie werkt in MySQL

  2. Onbekende primaire sleutel voor tafel krijgen terwijl de ID er is

  3. Databasequery-efficiëntie maximaliseren voor MySQL - deel één

  4. Oracle Cloud:een database voor autonome transactieverwerking (ATP) maken