2008-11-19 8 views
5

मैं सोच रहा था कि एक ग्रेडलिस्ट (या किसी भी प्रकार की सूची, उस मामले के लिए) को एक प्रीपेरस्टेटमेंट में बांधने का कोई तरीका था, जिसका अंततः ओरेकल डेटाबेस तक पहुंचने के लिए उपयोग किया जाएगा। मैंने पाया:मैं ओरेकल में एक प्रीपेर्डस्टेटमेंट में एक ऐरेलिस्ट को कैसे बांधूं?

PreparedStatement IN clause alternatives?

और जो कि मेरी समस्या के समान लगता है, लेकिन इस सवाल का अधिक विशिष्ट है: मैं, ओरेकल में प्रयोग की जाने वाली एक PreparedStatement को एक ArrayList बाध्य करने के लिए चाहते हैं, तो यह संभव है, कैसे क्या यह पूरा हो गया है?

+0

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

+0

मैट, java.util.List को लागू करने वाली सभी ऑब्जेक्ट्स एक प्राप्त (int) ऑपरेशन प्रदान करती हैं जो निर्दिष्ट अनुक्रमणिका पर ऑब्जेक्ट को पुनर्प्राप्त करती है। यह एक इटरेटर भी प्रदान करता है। ये दोनों गैर-वैकल्पिक हैं: आदेश अजीब हो सकता है, लेकिन एक आदेश मौजूद है। तो सभी java.util.List कार्यान्वयन * आदेश दिया गया है ... – MetroidFan2002

+0

... और, जावा में, सूची आम तौर पर java.util.List इंटरफ़ेस अनुबंध को संदर्भित करती है। – MetroidFan2002

उत्तर

5

देखें आप एक तैयार बयान में एक भी पैरामीटर के लिए एक सूची के लिए बाध्य नहीं कर सकते।

सूची में प्रत्येक तत्व के लिए एक पैरामीटर मार्कर, उदाहरण के लिए के साथ एसक्यूएल उत्पन्न करें:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?) 

भले ही आप प्रत्येक प्रश्न के लिए एक नया बयान उत्पन्न करेंगे, मैं अभी भी एक PreparedStatement का उपयोग कर सलाह देते हैं। यदि आपकी सूची में String उदाहरण हैं, तो आपको SQL इंजेक्शन से बचाने के लिए आवश्यक भागने की आवश्यकता होगी।

लेकिन अगर यह एक सुरक्षित प्रकार है, जैसे Integer ऑब्जेक्ट्स, कुछ ड्राइवर या मिडलवेयर PreparedStatements कैश कर सकते हैं, और एक ही प्रकार का अनुरोध किया गया है तो कैश किए गए उदाहरण को वापस कर सकते हैं। बेशक, कुछ परीक्षण जरूरी होगा। यदि आपकी सूचियां आकार में व्यापक रूप से भिन्न होती हैं, तो आपके पास कई अलग-अलग बयान होंगे, और खराब-लागू कैश इतने सारे को संभालने के लिए तैयार नहीं हो सकते हैं।

+0

यही वह था जिसे मैं डरता था, लेकिन ऐसा लगता है कि आपको "प्रश्न-चिह्न स्ट्रिंग" उत्पन्न करना है और इसे अपने सामान्य SQL कथन में जोड़ना है। ओह अच्छा। – MetroidFan2002

0

ठीक है, उस जवाब के आधार पर निर्णय लेना, विशेष रूप से उस प्रश्न में मेरे गलत उत्तर की टिप्पणियां, आप नहीं कर सकते।

http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857

+0

यह एक उपयोगी लिंक है, लेकिन यह वह नहीं था जिसे मैं जा रहा था। माफ़ कीजिये। – MetroidFan2002

3

आप इसे सीधे बाध्य नहीं कर सकते हैं। पैरामीटर के रूप में सरणी को पास करने का एक तरीका है। मुझे नहीं पता कि आप डेटाबेस पक्ष पर इसके साथ क्या करना चाहते हैं, इसलिए यह आपकी मदद नहीं कर सकता है।

असल में, आपको डेटाबेस में एक नेस्टेड टेबल प्रकार बनाना होगा; उस प्रकार के आधार पर जावा ऑब्जेक्ट बनाएं, जिसमें आपके सरणी से डेटा शामिल है; और पैरामीटर के रूप में पास करें।

यदि आप डेटाबेस में इन वस्तुओं बनाया:

String[] insertvalues = { "a", "b", "c" }; 
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES(?)"); 
ARRAY insertParameter = new ARRAY(a_desc, conn, insertvalues); 
p.setArray(1, insertParameter); 
p.execute(); 

Oracle में परिणाम इस तरह दिखेगा:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20); 
CREATE TABLE my_table (a my_nested_table) NESTED TABLE a STORE AS my_table_a; 

तो फिर तुम इस तरह जावा कोड लिख सकते हैं

dev> select * from my_table; 

A 
-------------------------------------------------------------------------------- 
MY_NESTED_TABLE('a', 'b', 'c') 
संबंधित मुद्दे