मुझे लगता है कि यह पूरी तरह से स्वीकार्य होगा यदि जेडीबीसी चालक ?
ऑपरेटर को अनचाहे होने के लिए अनुमति देता है और इसका उपयोग करता है, लेकिन यह 1) आपके पार्सर को वास्तव में इस ऑपरेटर से पैरामीटर की पहचान करने के लिए जटिल कर सकता है और 2) लोगों को (और शायद टूल्स) को भ्रमित कर सकता है जो ?
पर उपयोग किए जाते हैं केवल सर्वो का अर्थ है प्लेसहोल्डर।
तो मेरा सुझाव कुछ प्रकार के बचने (या वैकल्पिक ऑपरेटर) प्रदान करना होगा। हालांकि जेडीबीसी स्पेक को देखते हुए, ड्राइवरों को जेडीबीसी स्पेक में परिभाषित एस्केप को लागू करने के लिए केवल जेडीबीसी एस्केप सिंटैक्स का उपयोग करना चाहिए (13.4.2: "एस्केप सिंटैक्स का उपयोग प्रयोक्ता परिभाषित या विक्रेता विशिष्ट स्केलर फ़ंक्शंस को आमंत्रित करने के लिए नहीं किया जाना चाहिए। "; हालांकि यह विशेष रूप से {fn ...}
से बचने के बारे में है)।
तो या तो आपको वैकल्पिक बचने, या 'ब्रेक' नियमों का उपयोग करने की आवश्यकता है (मुझे नहीं लगता कि कोई भी दिमाग में होगा)। यदि आप अधिक अधिकृत उत्तर चाहते हैं, तो आप अपना प्रश्न jdbc-spec-discuss mailinglist पर भेज सकते हैं। मुझे यकीन है कि लांस एंडर्सन (जेडीबीसी स्पेस लीड) एक उत्तर प्रदान करेगा।
संपादित:
भी दिलचस्प ध्यान दें कि JDBC कल्पना अनुभाग 6.2 (दिशानिर्देश एवं आवश्यकताएँ) का कहना है:
ड्राइवर सहित अंतर्निहित डेटा स्रोत, द्वारा कार्यान्वित हर सुविधा के लिए पहुँच प्रदान करना चाहिए विशेषताएं जो जेडीबीसी एपीआई का विस्तार करती हैं। मूल अनुप्रयोगों के रूप में एक ही सुविधा सेट तक पहुंचने के लिए जेडीबीसी एपीआई का उपयोग करने वाले अनुप्रयोगों के लिए इरादा है।
तो इस पर आधारित है कि आपको ?
-ऑपरेटर का समर्थन करना चाहिए (आपको जरूरी नहीं है), आपको बस इसे करने का व्यावहारिक तरीका ढूंढना होगा।
अद्यतन discussion on jdbc-spec-discuss
के आधार पर लांस एंडरसन के अनुसार JDBC विनिर्देश के निशान पर सवाल खड़ा करने के संबंध में एसक्यूएल विवरण इस प्रकार है: वे केवल (बेशक को छोड़कर क्वेरी पाठ में पैरामीटर प्लेसहोल्डर के रूप में इस्तेमाल किया जा सकता टिप्पणियों और उद्धृत पाठ में), ?
के उपयोग के रूप में PostgreSQL hstore ऑपरेटरों में अनुमति नहीं दी जाएगी। (this message देखें)
उपलब्ध विकल्प या तो ऑपरेटर के लिए उपनाम या भागने के लिए उपलब्ध है, बशर्ते यह भविष्य में परिवर्तनों के साथ संघर्ष न करे (जो बिना किसी परेशानी के करना मुश्किल है;)। सबसे अच्छा समाधान - भविष्य में जेडीबीसी परिवर्तनों के साथ समस्याओं को रोकने के लिए - शायद एक कस्टम भागने है।
जेडीबीसी वास्तव में एक विक्रेता भागने को परिभाषित नहीं करता है, लेकिन लांस एंडर्सन जेडीबीसी से बचने वाले एक भागने का सुझाव देता है: {postgres <thing to be escaped>}
; इस भागने में vendorname या drivername का उपयोग नामस्थान का एक रूप प्रदान करेगा जो विनिर्देश के साथ संघर्ष को रोकना चाहिए।(this message देखें)
साथ 'सामान्य' JDBC समारोह निकल जाता है लाइन में होना करने के लिए, मैं एक भागने है कि आपके सवाल में क्वेरी की अनुमति देगा परिभाषित करने के लिए सुझाव है कि कहा जा करने के लिए के रूप में:
SELECT * FROM tbl WHERE {postgres containskey(tbl.data, 'abc')}
मैं containskey
चुना में ?
के अर्थ के आधार पर। ?&
: containsallkeys
) के लिए इसी तरह के सुझाव और ?|
: containsanykey
के लिए। स्थिरता के लिए आप अन्य हस्टोर ऑपरेटरों के लिए भी ऐसा करने पर विचार कर सकते हैं।
आप केवल प्रश्न चिह्न से बचने का निर्णय ले सकते हैं। उदाहरण के लिए {postgres '?'}
या {postgres qm}
(प्रश्न चिह्न के लिए qm) से बचें। आप नवीनतम PostgreSQL चालक है, तो
SELECT * FROM tbl WHERE tbl.data {postgres '?'} 'abc'
तो जेडीबीसी शुद्धवादी शायद शिकायत नहीं करेंगे कि [पोस्टग्रेस जेडीबीसी '?'] से बचने के लिए लागू किया गया है (http://www.postgresql.org/message-id/[email protected]) ? –
वैसे मैं वास्तव में किसी के लिए बात नहीं कर सकता लेकिन खुद, लेकिन मैं कहूंगा कि हैस्टोर ऑपरेटरों का उपयोग करने के उद्देश्य से '?' से बचने के लिए कार्यान्वयन करना काउंटर-उत्पादक होगा, क्योंकि ऐसा लगता है कि '?' हैस्टोर ऑपरेटर का मतलब है छोटे और पढ़ने के लिए आसान होने के लिए, और इससे बचने के लिए इसे और अधिक भारी और उलझन में डाल दिया जाएगा। (यह वैसे भी कैसा दिखता है? 'सी {?}' Foo''?) जैसा कि [एमेरिक के जवाब] में बताया गया है (http://stackoverflow.com/a/11958394/658907), पहले से ही 'अस्तित्व का उपयोग कर एक कामकाज है 'वह जेडीबीसी में काम करेगा। – matts
@matts लेकिन उस उत्तर की टिप्पणियों में से एक के रूप में यह इंगित करता है: यह वही काम नहीं करता है ('मौजूद 'सूचकांक का उपयोग नहीं करता है) –