Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak wywołać procedurę składowaną Oracle, która zawiera typ zdefiniowany przez użytkownika w java?

Ręczne konfigurowanie połączenia między obiektami Oracle SQL i obiektami Java nie jest prostym zadaniem. W szczególności tablice (lub tabele zagnieżdżone) obiektów zdefiniowanych przez użytkownika są bardziej złożone do przekazania z java do Oracle niż tablice standardowych typów danych. Innymi słowy, łatwiej jest wywołać procedurę z podpisem:

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

niż procedura, której podpis jest:

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

Możesz napisać otoczkę wokół procedury, aby przekształcić drugi przypadek w pierwszy przypadek.

Biorąc to pod uwagę, zdecydowanie nie jest niemożliwe zmapowanie twojej procedury. Poniższy przykład jest w dużej mierze inspirowany postem Toma Kyte. Tom opisuje, jak zmapować TABLE OF NUMBER za pomocą oracle.sql.ARRAY . W twoim przypadku będziemy musieli również użyć oracle.sql.STRUCT mapować IDS obiekt SQL.

Możesz także przejrzeć dokumentację Oracle JDBC, w szczególności rozdział Praca z typami obiektów Oracle.

Pierwsza to konfiguracja podobna do twojej:

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

Oto procedura 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

Nazwijmy to:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolumna tożsamości Oracle i wstaw do wyboru

  2. ORA-27154 / ORA-27146

  3. Oracle odpowiednik wskazówek dotyczących zapytań ROWLOCK, UPDLOCK, READPAST

  4. Nieprawidłowy miesiąc podczas wstawiania danych do Oracle

  5. Nagrody Oracle Database Developer Choice Awards