मेरे डेटाबेस में लाइब्रेरी jOOQ इंटरफ़ेसिंग में, मैं ओरेकल (या डीबी 2, आदि) पैकेजों के लिए समर्थन जोड़ना चाहता हूं। मैंने पहले ही संग्रहीत प्रक्रिया/फ़ंक्शन समर्थन लागू किया है जहां प्रत्येक संग्रहित ऑब्जेक्ट को जेनरेट की गई जावा क्लास के रूप में मॉडलिंग किया जाता है। उदाहरण के लिए, इस संग्रहीत समारोह के लिएओरेकल पैकेज और जावा पैकेज के बीच मैपिंग
CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;
एक वर्ग है कि इस तरह इस्तेमाल किया जा सकता उत्पन्न होगा (ध्यान दें, वहाँ भी, इस उदाहरण सिर्फ सामान्य डिजाइन से पता चलता हैं सुविधा के तरीकों की बहुत सारी):
// A new "function call instance". The function needs to be instanciated
// once per call
FAuthorExists f = new FAuthorExists();
// Set the function parameters on the call instance and call it
f.setAuthorName("Paulo");
f.execute(connection);
// Fetch the result from the function call instance
BigDecimal result = f.getReturnValue();
कारण मैंने मैपिंग एसक्यूएल फ़ंक्शन ->जावा क्लास इसलिए है क्योंकि संग्रहीत प्रक्रिया जटिल वापसी मान (कई आउट, या आउट पैरामीटर) की अनुमति देती है कि मैं प्रक्रिया को कॉल करने के बाद एक-एक करके लाने में सक्षम होना चाहता हूं:
p.getOutParam1();
p.getOutParam2();
अब यह डिज़ाइन संग्रहीत कार्यों/प्रक्रियाओं के साथ ठीक काम करता है, जहां ओवरलोडिंग संभव नहीं है। भीतर Oracle की (या डीबी 2 के) संकुल, हालांकि, मैं कई कार्य ही नाम के साथ हो सकता है, जैसे
CREATE PACKAGE my_package IS
FUNCTION f_author_exists (name VARCHAR2) RETURNS NUMBER;
FUNCTION f_author_exists (name VARCHAR2, country VARCHAR2) RETURNS NUMBER;
END my_package;
जब मैं समारोह (या प्रक्रिया) प्रति एक वर्ग उत्पन्न करते हैं, मैं कई FAuthorExists
जावा वर्गों के साथ नामकरण संघर्ष करना होगा । एक लंगड़ा समाधान वर्ग नाम में एक इंडेक्स जोड़ना है, जैसे कि FAuthorExists2
, FAuthorExists3
। एक अन्य लंगड़ा समाधान पैरामीटर नामों/प्रकारों से सीधे वर्गनाम में कुछ प्रकार के हैश मान (या मान स्वयं) उत्पन्न करना है, जैसे FAuthorExistsVARCHAR2
, FAuthorExistsVARCHAR2VARCHAR2
। स्पष्ट कारणों के लिए समाधान भी वांछनीय नहीं है।
क्या किसी के पास इस समस्या का कोई आसान समाधान है? या शायद एक बेहतर समग्र डिजाइन का एक विचार जो इस तरह के फ़ंक्शन नाम ओवरलोडिंग समस्याओं का उत्पादन नहीं करेगा?
कोई भी प्रतिक्रिया की सराहना की!
'execute()' विधि वास्तविक कॉल करता है। फ़ंक्शन तर्क 'नाम' के कारण विधि को' setName() 'कहा जाता है। मैंने इसे स्पष्ट किया है, उदाहरण के लिए, इसे और स्पष्ट करने के लिए। आपका विचार खराब नहीं है। हालांकि, समस्या यह है कि यदि आपके पास बहुत अलग तर्क सेट के साथ फ़ंक्शन नाम ओवरलोडिंग है, तो यह पता लगाने में भ्रमित हो सकता है कि तर्कों का संयोजन संभव है। लेकिन सुविधा विधियों के साथ, यह वास्तव में काम कर सकता है! रन-टाइम –
पर सही कॉल निर्धारित करने के विचार के लिए +1 @ नामों के बजाए तर्क प्रकारों पर मिलान करने वाले लुकास मेरे सुझाव से मेरा मतलब था - मैंने सोचा कि यह आसान हो सकता है। मुझे लगता है कि सिद्धांत में हालांकि संभव होगा। –
तर्क नाम/प्रकार/स्थिति के आधार पर फ़ंक्शन को कॉल करने के तरीके पर एक अच्छा कार्यान्वयन करना आसान है। लेकिन मुश्किल हिस्सा डेवलपर्स के लिए जेनरेट कोड का उपयोग करना आसान है। यही कारण है कि मैं उत्पन्न संकेतों में तर्क का नाम –