Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल संग्रहीत प्रक्रिया को कैसे कॉल करें जिसमें जावा में उपयोगकर्ता द्वारा परिभाषित प्रकार शामिल है?

Oracle SQL ऑब्जेक्ट्स और जावा ऑब्जेक्ट्स के बीच मैन्युअल रूप से एक लिंक सेट करना कोई मामूली काम नहीं है। विशेष रूप से, उपयोगकर्ता द्वारा परिभाषित वस्तुओं के सरणियाँ (या नेस्टेड टेबल) मानक डेटाटाइप के सरणियों की तुलना में जावा से ओरेकल तक जाने के लिए अधिक जटिल हैं। दूसरे शब्दों में, हस्ताक्षर के साथ एक प्रक्रिया को कॉल करना आसान है:

(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

यह जावा प्रक्रिया है:

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. ओरेकल में एमओडी () फ़ंक्शन

  2. Oracle PL/SQL:डायनेमिक SQL उदाहरण तत्काल निष्पादित करें का उपयोग कर

  3. Oracle में अलग-अलग कॉलम में varchar को विभाजित करें

  4. Oracle में संग्रहीत प्रक्रिया के लिए XML को पैरामीटर के रूप में कैसे पास करें?

  5. मैं ऑब्जेक्ट प्रकारों की नेस्टेड तालिकाओं के साथ Oracle तालिका कैसे बनाऊं?