2011-08-08 17 views
5

मैं तालिका से डेटा प्राप्त करने के लिए एक चयन कथन का उपयोग कर रहा हूं और फिर इसे किसी अन्य तालिका में डालता हूं। हालांकि लाइन "stmt.executeQuery (क्वेरी);" तालिका से पहली पंक्ति डालने के बाद बाहर निकलता है। जब मैं इस लाइन को टिप्पणी करता हूं, तो लूप उन्हें प्रिंट करने वाली सभी पंक्तियों के माध्यम से लूप करता है। Stacktrace कोई त्रुटि नहीं दिखा रहा है। ये क्यों हो रहा है?जबकि पुनरावृत्ति (rs.next()) कथन 1 पुनरावृत्ति के बाद समाप्त हो रहा है?

try{     
    String query = "SELECT * FROM "+schema_name+"."+table; 

    rs = stmt.executeQuery(query); 

    while (rs.next()) { 

     String bundle = rs.getString("BUNDLE"); 
     String project_cd = rs.getString("PROJECT_CD"); 
     String dropper = rs.getString("DROPPER"); 
     String week = rs.getString("WEEK"); 
     String drop_dt = rs.getString("DROP_DT").replace(" 00:00:00.0",""); 

     query = "INSERT INTO INDUCTION_INFO (BUNDLE, PROJECT_CD, DROPPER, WEEK, DROP_DT) " 
       + "VALUES (" 
       + bundle+"," 
       + "'"+project_cd+"'," 
       + dropper+"," 
       + week+"," 
       + "to_date('"+drop_dt+"','YYYY-MM-DD'))"; 

     System.out.println(query); 

     stmt.executeQuery(query); 
    } 
}catch(Exception e){ 
    e.printStackTrace(); 
} 
+0

एचएम ... असल में मुझे नहीं पता कि एक कथन पर 'executeUpdate()' को कॉल करने से पहले 'परिणामसेट' को बयान बंद कर दिया गया है। और मैं अभी परीक्षण करने के लिए बहुत आलसी हूं ... –

+1

विशिष्ट प्रश्न का उत्तर पहले से ही दिया गया है, लेकिन एक अवलोकन के रूप में: आपको एक तैयार कथन का उपयोग करना चाहिए और मूल्यों के साथ एक नया सम्मिलन बनाने के बजाय प्रत्येक बार बाध्य चर बदलना चाहिए हार्ड-कोडेड। (यह एक एसक्यूएल इंजेक्शन पाने के लिए एक असंभव जगह की तरह लगता है, लेकिन यह निर्भर करता है कि स्रोत तालिका में कौन प्रविष्टियां डाल सकता है ...)। लेकिन लूपिंग के बजाए, इसे एक हिट में एक चुनिंदा-डालने के साथ क्यों न करें? –

उत्तर

24

आप फिर से उपयोग करते हुए Statement कि अपने पाश की अंतिम पंक्ति पर rs निर्माण करने के लिए इस्तेमाल किया गया था रहे हैं।

यह ResultSetrs को बंद कर देगा। stated in the documentation के रूप में:

एक ResultSet वस्तु स्वचालित रूप से बंद कर दिया है जब Statement उद्देश्य यह है कि यह उत्पन्न, बंद कर दिया फिर से मार डाला, या एक से अधिक परिणाम के अनुक्रम से अगले परिणाम पुनः प्राप्त करने के लिए किया जाता है।

आप एक दूसरी Statement वस्तु का उपयोग करने के INSERT स्टेटमेंट्स को निष्पादित करने की जरूरत है।

9

Statement वस्तुओं केवल जब तुम पर अमल कि INSERT, आप ResultSet जो यह उत्पन्न अमान्य एक समय में एक बात कर सकते हैं, इसलिए। INSERT करने के लिए आपको दूसरी Statement ऑब्जेक्ट बनाने की आवश्यकता होगी।

Statement documentation से: "डिफ़ॉल्ट रूप से, केवल एक परिणाम ऑब्जेक्ट प्रति ऑब्जेक्ट ऑब्जेक्ट ऑब्जेक्ट एक ही समय में खुल सकता है। इसलिए, यदि एक परिणामसेट ऑब्जेक्ट को पढ़ने के लिए दूसरे के पढ़ने के साथ अंतःस्थापित किया जाता है, तो प्रत्येक को उत्पन्न होना चाहिए अलग-अलग वक्तव्य ऑब्जेक्ट्स। स्टेटमेंट इंटरफ़ेस में सभी निष्पादन विधियां एक ओपन एक मौजूद होने पर एक स्टेटमेंट के वर्तमान परिणामसेट ऑब्जेक्ट को पूर्ण रूप से बंद कर देती हैं। "

1

यदि आप एक ही कथन का उपयोग करते हैं, तो यह पिछले परिणाम सेट को अमान्य कर देगा। अपडेट/आवेषण करने के लिए आपको एक अलग कथन का उपयोग करना चाहिए।

1

यह इंटरफ़ेस Statement के जावा डॉक्स से है:

डिफ़ॉल्ट रूप से, वक्तव्य वस्तु में केवल एक ResultSet वस्तु खुला हो सकता है एक ही समय में ।

तो आप बेहतर दूसरे Statement या बेहतर PreparedStatement का बेहतर उपयोग करते हैं।

और एक INSERT SQL कथन निष्पादित करने के लिए आपको executeQuery() के बजाय executeUpdate() का उपयोग करना चाहिए।

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