Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да извика съхранена процедура на Oracle, която включва дефиниран от потребителя тип в java?

Създаването на връзка между Oracle SQL обекти и java обекти ръчно не е тривиална задача. По-специално, масивите (или вложените таблици) от дефинирани от потребителя обекти са по-сложни за предаване от java към Oracle, отколкото масивите от стандартни типове данни. С други думи, по-лесно е да се извика процедура с подпис:

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

отколкото процедура, чийто подпис е:

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

Можете да напишете обвивка около вашата процедура, за да трансформирате втория случай в първия.

Като се има предвид това, далеч не е невъзможно да картографирате вашата процедура. Следният пример до голяма степен е вдъхновен от публикация на Том Кайт. Том описва как да картографирате TABLE OF NUMBER използвайки oracle.sql.ARRAY . Във вашия случай ще трябва също да използваме oracle.sql.STRUCT за картографиране на IDS SQL обект.

Може също да искате да прегледате документа Oracle JDBC, по-специално главата Работа с типове обекти на Oracle.

Първо е настройка, подобна на вашата:

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

Това е 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

Нека го наречем:

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

  2. UTL_FILE.FREMOVE Пример:Изтриване на файл в Oracle

  3. Какво означава <> в Oracle

  4. Как правилно да обработваме датите в ограниченията на заявките

  5. НАЧАЛО - КРАЙ блок атомарни транзакции в PL/SQL