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

MyBatis और Oracle संग्रहित प्रक्रियाओं के साथ बल्क अपडेट करना

एक प्रक्रिया तालिका प्रकार पैरामीटर ले सकती है और आप एक कस्टम प्रकार हैंडलर लिख सकते हैं जो रूपांतरण करता है।

ठोस वस्तुओं का उपयोग करके व्याख्या करना आसान हो सकता है।
MY_TYPE के बजाय , मैं S_USER_OBJ का उपयोग करूंगा ...

S_USER_OBJ को ऑब्जेक्ट के रूप में बनाएं या बदलें (आईडी पूर्णांक, नाम varchar(20)); 

...एक टेबल...

तालिका उपयोगकर्ता बनाएं (आईडी पूर्णांक, नाम varchar(20)); 

...और एक पीओजेओ।

सार्वजनिक वर्ग उपयोगकर्ता { निजी पूर्णांक आईडी; निजी स्ट्रिंग नाम; // सेटर/गेट्टर} 

यहाँ नया प्रकार है जो S_USER_OBJ . का संग्रह है ।

S_USER_OBJ_LIST प्रकार को S_USER_OBJ की तालिका के रूप में बनाएं या बदलें; 

प्रक्रिया तालिका प्रकार को पैरामीटर के रूप में ले सकती है। उदा.

प्रक्रिया बनाएं या बदलें doUpdate(user_list in S_USER_OBJ_LIST, user_out out S_USER_OBJ_LIST) isbegin -- process IN param for i in user_list.first .. user_list.last loop update users set name =user_list(i).name) जहां id =user_list(i).id; अंत लूप; -- सेट आउट परम चयन * बल्क कलेक्ट इन यूजर_आउट (यूज़र्स यू से S_USER_OBJ(u.id, u.name) चुनें);अंत; 

मैपर इस तरह दिखेगा:

void doUpdate( @Param("users") List Users, @Param("outParam") Map outParam); 
 {कॉल doUpdate(#{users,typeHandler=pkg.UserListTypeHandler}, #{outParam.outUsers,jdbcType=ARRAY,jdbcTypeName=S_USER_OBJ_LIST,mode=OUT, टाइपहैंडलर=pkg.UserListTypeHandler} )} 

UserListTypeHandler एक कस्टम प्रकार का हैंडलर है जो सूची<उपयोगकर्ता> . को कनवर्ट करता है एक ARRAY . से/में STRUCT . का ।

आयात करें आयात करें .jdbc.driver.OracleConnection; पब्लिक क्लास UserListTypeHandler, BaseTypeHandler>{@Override public void setNonNullParameter(ReadedStatement ps, int i, List पैरामीटर, JdbcType jdbcType) को SQLException फेंकता है {कनेक्शन conn =ps.getConnection( ); सूची <स्ट्रक्चर> स्ट्रक्चर्स =नई ऐरेलिस्ट <स्ट्रक्चर> (); के लिए (int idx =0; idx <पैरामीटर आकार (); idx++) { उपयोगकर्ता उपयोगकर्ता =पैरामीटर। प्राप्त (idx); ऑब्जेक्ट [] परिणाम ={user.getId (), user.getName ()}; structs.add(conn.createStruct("S_USER_OBJ", परिणाम)); } सरणी सरणी =((OracleConnection) conn) .createOracleArray("S_USER_OBJ_LIST", structs.toArray ()); ps.setArray (i, सरणी); सरणी मुक्त (); } @ ओवरराइड सार्वजनिक सूची <उपयोगकर्ता> getNullableResult (CallableStatement cs, int columnIndex) SQLException फेंकता है {सूची <उपयोगकर्ता> परिणाम =नया ऐरेलिस्ट <> (); सरणी सरणी =cs.getArray(columnIndex); ऑब्जेक्ट [] objs =(ऑब्जेक्ट []) array.getArray (); के लिए (ऑब्जेक्ट obj:objs) {ऑब्जेक्ट [] attrs =((स्ट्रक्चर) obj)। getAttributes (); result.add (नया उपयोगकर्ता (((बिगडेसिमल) attrs [0])। intValue (), (स्ट्रिंग) attrs [1])); } सरणी। मुक्त (); वापसी परिणाम; } ...}

विधि का उपयोग करने वाला कोड कुछ इस तरह दिखाई देगा।

मानचित्र<स्ट्रिंग, ?> outParam =new HashMap<>();mapper.doUpdate(userList, outParam); List outUsers =outParam.get("outUsers"); 

बाहर के लिए पैरामीटर, refcursor और परिणाम मानचित्र का उपयोग करने का एक और तरीका भी है।
मैपर स्टेटमेंट में, OUT पैरामीटर को निम्नानुसार निर्दिष्ट करें।

#{outParam.outUsers,jdbcType=CURSOR,javaType=java.sql.ResultSet,mode=OUT,resultMap=userRM} 

परिणाम नक्शा बहुत सीधा है।

  
 

इस प्रक्रिया में, OUT पैरामीटर को SYS_REFCURSOR . के रूप में घोषित करें

अपडेट करने की प्रक्रिया बनाएं या बदलें (S_USER_OBJ_LIST में user_list, SYS_REFCURSOR से user_out बाहर) isbegin ... -- सेट आउट परम खुले user_out के लिए चुनिंदा * उपयोगकर्ताओं से; अंत; 

यहां एक निष्पादन योग्य डेमो है:
https://github .com/harawata/mybatis-issues/tree/master/so-56834806




  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 में किसी दिनांक को फ़ॉर्मेट करते समय वर्ष की वर्तनी कैसे करें

  3. प्रक्रिया में गतिशील अद्यतन क्वेरी

  4. Oracle PL/SQL में ONLINE का उपयोग करके गैर-विभाजन तालिका को विभाजित तालिका में बदलें

  5. dbms_scheduler का उपयोग करके किसी कार्य को विशेष समय पर चलाने के लिए शेड्यूल कैसे करें