2011-08-25 17 views
12

जेडीबीसी (ओरेकल) का उपयोग करके मुझे दो टेबलों में से प्रत्येक में हजार पंक्तियों को सम्मिलित करने की आवश्यकता है। कुछ ऐसा:जावा जेडीबीसी - एकाधिक तैयार कथन थोक सम्मिलित

"INSERT INTO TABLE_A (A_ID, A_NAME, A_LAST_NAME) VALUES (MY_SEQUENCE.NEXTVAL, ?, ?)"; 
"INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (MY_SEQUENCE.CURRVAL, ?)"; 

समस्या यह है कि दोनों टेबल सामान्य अनुक्रम के माध्यम से जुड़े हुए हैं, ताकि कथन का क्रम महत्वपूर्ण हो।

यदि मेरे पास केवल एक टेबल थी तो यह काफी आसान होगा। उस मामले में मैं कोड का इस्तेमाल किया:

String insert = "Insert into TABLE_A(A_ID, A_NAME, A_LAST_NAME) values(MY_SEQUENCE.NEXTVAL, ?, ?)"; 
conn.setAutoCommit(false); 
PreparedStatement ps = conn.prepareStatement(insert); 
for(MyObject obj : myCollection) { 
    ps.setString(1, obj.getName()); 
    ps.setString(2, obj.getLastName()); 
    ps.addBatch(); 
} 
ps.executeBatch(); 
conn.commit(); 
ps.close(); 

लेकिन इस दृष्टिकोण इस प्रकार केवल एक सम्मिलित के साथ केवल एक तैयार बयान के साथ काम करते हैं और कर सकते हैं। मैं इस समस्या के लिए समाधान कैसे प्रदान कर सकता हूं?

उत्तर

12

आप

PreparedStatement ps = conn.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS); 
... 
ps.executeBatch(); 

तो

ResultSet rs = ps.getGeneratedKeys(); 
ps = conn.prepareStatement("INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (?, ?)"); 

for (int counter =0;rs.next(); counter++) { 
    ps.setInt(1,rs.getInt(0)); 
    ps.setString(2, myCollection.get(counter).getDescription()); 
    ps.addBatch(); 
} 
... 
1

यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो आपको NEXTVAL और CURRVAL के साथ कोई समस्या है क्योंकि CURRVAL अन्य डीबी उपयोग के कारण बदल सकता है? यदि हां, तो आप इस आदेश के लिए अपने कोड बदल सकते हैं:

currentNextVal = select NEXTVAL 
INSERT into table_a with currentNextVal as the id 
INSERT into table_b with the same currentNextVal 

मैं सही ढंग से अपने समस्या को समझने किया?

+0

आंशिक रूप से आप सही कह रहे हैं, लेकिन और अधिक जटिल समस्या एक और के बारे में 1000 बार के बाद जावा में दोनों डालने बयान निष्पादित करने के लिए प्रयास कर सकते हैं ताकि एक में प्रत्येक पंक्ति तालिका एक पंक्ति में एक पंक्ति के अनुरूप होगी (ए_आईडी = बी_आईडी)। यदि यह केवल एक डालने वाला था, तो हम एडबैच() का उपयोग कर सकते हैं जैसा कि मैंने उदाहरण में दिखाया है और इससे प्रदर्शन में वृद्धि होगी। लेकिन ऐसा लगता है कि जावा में दो तैयार बयान के साथ यह संभव नहीं है, और इससे प्रदर्शन की समस्याएं हो सकती हैं। – agav

+0

यदि आप मेरे छद्म कोड से "currentNextVal" का उपयोग करते हैं, तो आप इसे प्राप्त करेंगे। आपको इसे बैच में करने की ज़रूरत नहीं है, हालांकि आप इसे 2 बैचों में कर सकते हैं ... – IncrediApp

संबंधित मुद्दे