Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara memanggil prosedur tersimpan Oracle yang menyertakan tipe yang ditentukan pengguna di java?

Menyiapkan tautan antara objek Oracle SQL dan objek Java secara manual bukanlah tugas yang sepele. Secara khusus, array (atau tabel bersarang) dari objek yang ditentukan pengguna lebih kompleks untuk diteruskan dari java ke Oracle daripada array tipe data standar. Dengan kata lain, lebih mudah untuk memanggil prosedur dengan tanda tangan:

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

dari prosedur yang tanda tangannya adalah:

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

Anda dapat menulis pembungkus di sekitar prosedur Anda untuk mengubah kasus kedua menjadi kasus pertama.

Meskipun demikian, sejauh ini bukan tidak mungkin untuk memetakan prosedur Anda. Contoh berikut sebagian besar terinspirasi oleh posting oleh Tom Kyte. Tom menjelaskan cara memetakan TABLE OF NUMBER menggunakan oracle.sql.ARRAY . Dalam kasus Anda, kami juga harus menggunakan oracle.sql.STRUCT untuk memetakan IDS objek SQL.

Anda mungkin juga ingin menelusuri dokumen Oracle JDBC, khususnya bab Bekerja dengan Tipe Objek Oracle.

Pertama adalah pengaturan yang mirip dengan Anda:

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

Ini adalah prosedur 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

Sebut saja:

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. SQL:bagaimana cara menggunakan UNION dan memesan dengan pilihan tertentu?

  2. Menggunakan `SELECT` untuk memanggil fungsi

  3. Dapatkan kueri dari file di SPRING BOOT menggunakan @Query

  4. Cara Menulis ke File CSV Menggunakan Oracle SQL*Plus

  5. 2 Cara Mendapatkan Hari dari Kencan di Oracle