2013-03-28 4 views
10

मैं जेडीबीसी बैच आवेषण का उपयोग करके कई रिकॉर्ड डाल रहा हूं। क्या प्रत्येक रिकॉर्ड के लिए जेनरेट की गई कुंजी प्राप्त करने का कोई तरीका है? क्या मैं बैच प्रविष्टियों के साथ ps.getGeneratedKeys() का उपयोग कर सकता हूं?ओरेकल में जेडीबीसी बैच डालने से उत्पन्न कुंजी कैसे प्राप्त करें?

मैं oracle.jdbc.OracleDriver

final String insert = "Insert into Student(RollNumber, Name, Age) values(StudentSEQ.nextval, ? , ?)"; 
final int BATCH_SIZE = 998; 
int count = 0; 
Connection con = null; 
PreparedStatement ps = null; 
try { 
    con = getConnection(); 
    ps = con.prepareStatement(insert); 
    for (Student s : students) { 
     ps.setString(1, s.getName()); 
     ps.setInt(2, s.getAge()); 
     ps.addBatch(); 
     count++; 
     if (count % BATCH_SIZE == 0) { 
     // Insert records in batches 
      ps.executeBatch(); 
     } 
    } 
    // Insert remaining records 
    ps.executeBatch(); 
} finally { 
    if(ps != null) 
     ps.close(); 
    release(con); 
} 

उपयोग कर रहा हूँ मैं ps.getGeneratedKeys() पाश अंदर के साथ ps.executeUpdate() का उपयोग कर वांछित परिणाम प्राप्त करने की सोच रहा हूँ। कोई अन्य समाधान?

+1

क्या आप अपने बैच आवेषण में अनुक्रमों का उपयोग करते हैं? – Rachcha

+0

हां, छात्रसेक्यू तालिका के लिए अनुक्रम है। – atripathi

उत्तर

3

ऐसा लगता है कि ओरेकल 12C निम्नलिखित पृष्ठ के अनुसार बैच अद्यतन स्वचालित रूप से जेनरेट कुंजी संयोजन का समर्थन नहीं करता:

http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbcvers.htm

उपधारा धारा के तहत लेबल "सीमाओं" देखें "ऑटो की रिट्रीवल जेनरेटेड कीज "

6

JDBC 4.1 specification, खंड 13.6 पुन: प्राप्त ऑटो उत्पन्न मूल्यों का कहना है:

यह कार्यान्वयन से परिभाषित करने के लिए है कि क्या getGeneratedKeysexecuteBatch विधि लागू करने के बाद उत्पन्न मूल्यों वापस आ जाएगी के रूप में है।

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

आप बैच अद्यतन स्वचालित रूप से जेनरेट कुंजी नहीं जोड़ सकते: जैसा कि the answer by Philip O. में संकेत, उत्पन्न कुंजी की बहाली के रूप में Oracle 12 JDBC Standards Support में दर्ज बैच अद्यतन के साथ समर्थित नहीं है।

किसी भी मामले में अगर यह आपके बयान से अपने ड्राइवर के द्वारा समर्थित है तैयार करने के लिए नीचे दिए गए कोड को बदला जाना चाहिए चालक को निर्देश देने उत्पन्न कुंजी को पुनः प्राप्त करने:

ps = con.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS); 

नोट: यदि आप उपयोग करना पड़ सकता अन्य जेनरेट की गई कुंजियों में से एक विधि तैयार करें (prepareStatement(sql, columnIndexes) या prepareStatement(sql, columnNames)) क्योंकि ओरेकल ROW_ID को मेरे उदाहरण में विधि के साथ वापस कर देगा।

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