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

जावा - कस्टम प्रकारों के साथ ऑरैकल प्रक्रिया को कैसे कॉल करें?

Oracle सेटअप :

  प्रकार बनाएं या बदलें BD_TB_STRUCT AS OBJECT( start_ts TIMESTAMP(3), end_ts TIMESTAMP(3), time_type NUMBER(19), अवधि NUMBER(12)) फाइनल;/क्रिएट या रिप्लेस प्रक्रिया मर्ज_1_bd_s , s2_bd_t में bd_tb_struct, r_bd_t OUT bd_tb_struct) IS p_start TIMESTAMP(3):=LEAST(s1_bd_t.start_ts, s2_bd_t.start_ts); p_end TIMESTAMP(3):=ग्रेटेस्ट(s1_bd_t.end_ts, s2_bd_t.end_ts);BEGIN r_bd_t:=new BD_TB_STRUCT(p_start, p_end, COALESCE(s1_bd_t. DATE_type, _t. p_start AS DATE ) ) * 24 * 60 * 60 );END;/ 

जावा SQLData क्लास :

आयात करें .sql.Timestamp;import java.time.LocalDateTime;import java.time.ZoneOffset;सार्वजनिक वर्ग BoundsSQL SQLData {सार्वजनिक स्थिर अंतिम स्ट्रिंग SQL_TYPE ="BD_TB_STRUCT" को लागू करता है; सार्वजनिक java.sql.Timestamp प्रारंभ; सार्वजनिक java.sql.Timestamp अंत; सार्वजनिक बिगइंटर प्रकार; सार्वजनिक BigInteger अवधि; पब्लिक बाउंड्सएसक्यूएल () { } पब्लिक बाउंड्सएसक्यूएल (फाइनल इंट ईयर, फाइनल इंट मंथ, फाइनल इंट डेऑफमोन्थ, फाइनल इंट ऑवर, फाइनल इंट मिनट, फाइनल इंट सेकेंड, फाइनल लॉन्ग ड्यूरेशन, फाइनल लॉन्ग टाइप) { फाइनल लॉन्ग एपोचसेकंड =लोकलडेटटाइम। वर्ष, माह, दिन का महीना, घंटा, मिनट, सेकंड)। this.start =नया टाइमस्टैम्प (युग सेकेंड * 1000); this.end =नया टाइमस्टैम्प ((युग सेकेंड + अवधि) * 1000); यह अवधि =BigInteger.valueOf (अवधि); this.type =BigInteger.valueOf (प्रकार); } @ ओवरराइड सार्वजनिक स्ट्रिंग getSQLTypeName() SQLException फेंकता है { SQL_TYPE लौटाएं; } @ ओवरराइड सार्वजनिक शून्य रीडएसक्यूएल (एसक्यूएल इनपुट स्ट्रीम, स्ट्रिंग टाइपनाम) एसक्यूएलएक्सप्शन फेंकता है {स्टार्ट =स्ट्रीम। रीडटाइमस्टैम्प (); अंत =स्ट्रीम.रीडटाइमस्टैम्प (); टाइप =स्ट्रीम.रीडबिगडिसीमल ()। टूबिगइंटर (); अवधि =stream.readBigDecimal ()। toBigInteger (); } @ ओवरराइड पब्लिक शून्य राइटएसक्यूएल (एसक्यूएलऑटपुट स्ट्रीम) एसक्यूएलएक्सप्शन फेंकता है {stream.writeTimestamp (शुरू); स्ट्रीम.राइटटाइमस्टैम्प (अंत); स्ट्रीम.राइटबिगडेसिमल (नया बिगडेसिमल (टाइप)); स्ट्रीम.राइटबिगडेसिमल (नया बिगडेसिमल (अवधि)); } @ ओवरराइड पब्लिक स्ट्रिंग टूस्ट्रिंग () {रिटर्न स्ट्रिंग।फॉर्मैट ("प्रारंभ:% s \ n समाप्ति:% s \ n अवधि:% s \ n टाइप:% s", प्रारंभ, समाप्ति, अवधि, प्रकार); }}

जावा से संग्रहित प्रक्रिया को कॉल करें :

OracleCallableStatement#setObject(int, Object) का उपयोग करके संग्रहीत कार्यविधि को कॉल करें पैरामीटर पास करने के लिए और कक्षा को एक प्रकार के मानचित्र में रखने के लिए और OracleCallableStatement#registerOutParameter(int, int, string) का उपयोग करें और OracleCallableStatement#getObject(int) मापदंडों को पुनः प्राप्त करने के लिए।

आयात करें PassStructToProcedure {सार्वजनिक स्थैतिक शून्य मुख्य (अंतिम स्ट्रिंग [] args) {OracleConnection con =null; कोशिश करें { Class.forName ("oracle.jdbc.OracleDriver"); con =(OracleConnection) DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl", "USERNAME", "PASSWORD"); बाउंडएसक्यूएल बाउंड1 =नया बाउंडएसक्यूएल (2019, 1, 1, 0, 0, 0, 10, 1); बाउंडएसक्यूएल बाउंड2 =नया बाउंडएसक्यूएल (2019, 1, 1, 0, 0, 5, 10, 2); OracleCallableStatement st =(OracleCallableStatement) con.prepareCall ("{कॉल MERGE_TIME_BOUNDS (?,?,?)}"); st.setObject( 1, बाउंड1 ); st.setObject( 2, बाउंड2 ); st.registerOutParameter( 3, OracleTypes.STRUCT, BoundsSQL.SQL_TYPE); st.execute (); नक्शा<स्ट्रिंग,वर्ग>टाइपमैप =con.getTypeMap(); typeMap.put (BoundsSQL.SQL_TYPE, BoundsSQL.class); बाउंडएसक्यूएल आउट =(बाउंडएसक्यूएल) st.getObject( 3 ); System.out.println (out.toString ()); सेंट बंद (); } पकड़ें (ClassNotFoundException | SQLException पूर्व) { System.out.println (उदा. getMessage ()); उदा.प्रिंटस्टैकट्रेस (); } अंत में {कोशिश {अगर (कोन! =अशक्त) con.close (); } कैच (एसक्यूएलएक्सप्शन ई) { } } }}

आउटपुट :

प्रारंभ:2019-01-01 00:00:00.0अंत:2019-01-01 00:00:15.0अवधि:15प्रकार:1 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL:किसी तालिका को किसी अन्य तालिका के डेटा से अपडेट करें

  2. EM13c . में अलर्ट लॉग फ़िल्टर करना

  3. समाधान एक क्वेरी के अंदर एक डीएमएल ऑपरेशन नहीं कर सकता है?

  4. क्या स्पष्ट एएनएसआई जॉइन बनाम निहित जॉइन के उपयोग पर ओरेकल की आधिकारिक सिफारिश है?

  5. PostgreSQL/Oracle में दो तिथियों के बीच अंतर की गणना कैसे करें