sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kalder man oracle-lagret procedure, som inkluderer brugerdefineret type i java?

Opsætning af et link mellem Oracle SQL-objekter og java-objekter manuelt er ikke en triviel opgave. Især arrays (eller indlejrede tabeller) af brugerdefinerede objekter er mere komplekse at overføre fra java til Oracle end arrays af standarddatatyper. Det er med andre ord nemmere at kalde en procedure med signatur:

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

end en procedure, hvis underskrift er:

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

Du kan skrive en indpakning omkring din procedure for at omdanne den anden sag til den første sag.

Når det så er sagt, er det langtfra umuligt at kortlægge din procedure. Det følgende eksempel er i høj grad inspireret af et indlæg af Tom Kyte. Tom beskriver, hvordan man kortlægger en TABLE OF NUMBER ved hjælp af oracle.sql.ARRAY . I dit tilfælde bliver vi også nødt til at bruge oracle.sql.STRUCT for at kortlægge IDS SQL-objekt.

Du vil måske også gennemse Oracle JDBC-dokumentet, især kapitlet Arbejde med Oracle-objekttyper.

Først er en opsætning, der ligner din:

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

Dette er java-proceduren:

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

Lad os kalde det:

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. Hvad betyder det, når MySQL er i tilstanden Sender data?

  2. Vend denne vej z/y/x i Oracle til x/y/z

  3. mysqli:kan det forberede flere forespørgsler i en erklæring?

  4. Funktion til at beregne median i SQL Server