2010-11-22 18 views
14
  1. PreparedStatement.setNull के जावा दस्तावेज़ों के अनुसार: "नोट: आपको पैरामीटर के SQL प्रकार निर्दिष्ट करना होगा"। इस विधि के लिए एसक्यूएल प्रकार के कॉलम की आवश्यकता क्या है?क्यों PreparedStatement.setNull को sqlType की आवश्यकता है?

  2. मैंने देखा कि java.sql.ypes.VARCHAR पास करने से गैर-वर्कर स्तंभों के लिए भी काम करता है। क्या ऐसे परिदृश्य हैं जिनमें VARCHAR उपयुक्त नहीं होगा (कुछ कॉलम प्रकार या कुछ डीबी प्रदाता)?

धन्यवाद।

उत्तर

10

PreparedStatement.setNull के जावा डॉक्स के अनुसार: "ध्यान दें: आप पैरामीटर के एसक्यूएल प्रकार निर्दिष्ट करना होगा"। विधि के लिए कॉलम के SQL प्रकार की आवश्यकता क्यों है?

अधिकतम संगतता के लिए; विनिर्देश के अनुसार, कुछ डेटाबेस हैं जो अनियमित न्यूल को अंतर्निहित डेटा स्रोत पर भेजने की अनुमति नहीं देते हैं।

मैंने देखा है कि गुजर java.sql.Types.VARCHAR भी गैर varchar स्तंभों के लिए काम करता है। क्या परिदृश्य हैं जिनमें VARCHAR उपयुक्त नहीं होगा (कुछ कॉलम प्रकार या कुछ डीबी प्रदाताओं)?

मुझे नहीं लगता कि वास्तव में व्यवहार का व्यवहार वास्तव में विनिर्देश का हिस्सा है या यदि यह है, तो मुझे यकीन है कि वहां कुछ प्रकार के अंतर्निहित दबाव चल रहे हैं। किसी भी मामले में, इस तरह के व्यवहार पर भरोसा करते हैं जो अंतर्निहित डेटास्टोर परिवर्तनों की सिफारिश नहीं की जाती है। क्यों सही प्रकार निर्दिष्ट नहीं है?

+0

1. मुझे अभी भी समझ में नहीं आता कि मुझे इस प्रकार की घोषणा क्यों करनी है। जहां तक ​​मुझे पता है कि SET MY_COLUMN = NULL प्रत्येक कॉलम प्रकार पर काम करेगा, तो यह पर्याप्त क्यों नहीं है? – MosheElisha

+0

2. मेरे पास एक विधि है जो SQL स्ट्रिंग और संग्रह प्राप्त करती है और प्रत्येक ऑब्जेक्ट के लिए PreparedStatement.setObject/setNull को आमंत्रित करती है। यदि मैं चाहता हूं कि सही प्रकार को सेट करने के लिए पास किया जाएगा तो मुझे प्रत्येक ऑब्जेक्ट के प्रकार को पारित करने और बदसूरत बनाने की आवश्यकता है। यदि डेटाबेस ड्राइवर सेटऑब्जेक्ट को संभाल सकता है, तो मेरी राय में, इसे setNull को संभालना चाहिए और आंतरिक रूप से भी जांचना चाहिए। – MosheElisha

+1

@user: 1 के संबंध में; जैसा कि मैंने पहले ही उल्लेख किया है, जेडीबीसी डेटाबेस के साथ बातचीत को मानकीकृत करने का प्रयास है, लेकिन वहां प्रत्येक डेटाबेस कार्यान्वयन के पास चीजों को करने का अपना तरीका है। उदाहरण के लिए मैंने सुना है कि ओरेकल शिकायत करता है कि न्यूल सेट करते समय उचित प्रकार की आपूर्ति नहीं की जाती है। इसलिए जेडीबीसी की आवश्यकता है कि आप इस प्रकार को निर्दिष्ट करें, अंतर्निहित जेडीबीसी कार्यान्वयन डेटाबेस पर इसे पास करता है या नहीं। यदि कोई विशेष डेटाबेस वायर प्रोटोकॉल तय करता है कि नल मानों को सेट करते समय प्रकारों को पारित किया जाता है तो इसकी सहायता नहीं की जा सकती है, इसलिए इसके साथ तर्क में कोई बात नहीं है। –

7

जेडीबीसी ड्राइवर setNull से दूर जा रहे प्रतीत होते हैं। Add support for setObject(<arg>, null) देखें।

अधिक तार्किक व्यवहार समर्थन डेटाबेस की मेरी सूची में है:

  1. ओरेकल
  2. MySQL
  3. Sybase
  4. एमएस एसक्यूएल सर्वर
  5. HSQL

मेरे डेटाबेस की सूची इस तार्किक व्यवहार का समर्थन नहीं कर रहा है:

  1. डर्बी Queries with guarded null Parameter fail
  2. PostgreSQL Cannot pass null in Parameter in Query for ISNULLSuggested solution
+0

जानना अच्छा है। धन्यवाद! – MosheElisha

1

यह ओरेकल की बात आती है यह बहुत अन्य डेटाटाइप्स की ओर varchar2 उपयोग करने के लिए मूर्ख होगा। यह अनुकूलक को मूर्ख बना सकता है और आपको खराब निष्पादन योजना मिल सकती है। उदाहरण के लिए, अपने बाइंड में टाइमस्टैम्प डेटाटाइप का उपयोग करके डेट कॉलम पर फ़िल्टर करना, ओरेकल सभी तिथियों को टाइमस्टैम्प में परिवर्तित करने, फिर वांछित पंक्तियों को फ़िल्टर करने के बाद आपकी सभी पंक्तियों को पढ़ना समाप्त कर सकता है। यदि आपके पास अपने दिनांक कॉलम पर एक इंडेक्स है, तो यह भी बदतर हो सकता है (अगर ऑरैकल इसका उपयोग करना चुनता है) - अपने ऑरैक ब्लॉक पर एकल पढ़ना।

--Lasse

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