Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để gọi thủ tục được lưu trữ oracle bao gồm kiểu do người dùng xác định trong java?

Thiết lập liên kết giữa các đối tượng Oracle SQL và các đối tượng java theo cách thủ công không phải là một nhiệm vụ tầm thường. Đặc biệt, mảng (hoặc bảng lồng nhau) của các đối tượng do người dùng định nghĩa phức tạp hơn để chuyển từ java sang Oracle so với mảng của kiểu dữ liệu chuẩn. Nói cách khác, việc gọi một thủ tục có chữ ký sẽ dễ dàng hơn:

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

hơn một thủ tục có chữ ký là:

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

Bạn có thể viết một trình bao bọc xung quanh thủ tục của mình để chuyển trường hợp thứ hai thành trường hợp đầu tiên.

Điều đó đang được nói, nó không phải là không thể lập bản đồ thủ tục của bạn. Ví dụ sau phần lớn được lấy cảm hứng từ một bài đăng của Tom Kyte. Tom mô tả cách lập bản đồ TABLE OF NUMBER sử dụng oracle.sql.ARRAY . Trong trường hợp của bạn, chúng tôi cũng sẽ phải sử dụng oracle.sql.STRUCT để ánh xạ IDS Đối tượng SQL.

Bạn cũng có thể muốn duyệt tài liệu Oracle JDBC, đặc biệt là chương Làm việc với các kiểu đối tượng Oracle.

Đầu tiên là một thiết lập tương tự như của bạn:

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

Đây là thủ tục 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

Hãy gọi nó là:

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. Quá trình nâng cấp từng bước lên R12.2 Nâng cấp phần -3

  2. Một cách để kiểm tra Oracle đã hoàn thành sql

  3. Thay đổi cổng Oracle từ cổng 8080

  4. ĐẶT SQLBLANKLINES:Cách Cho phép Dòng trống trong SQLcl &SQL * Plus

  5. Làm cách nào để đặt định dạng ngày giờ tùy chỉnh trong Oracle SQL Developer?