2010-12-14 12 views
6

मेरे डेटाबेस में लाइब्रेरी 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। स्पष्ट कारणों के लिए समाधान भी वांछनीय नहीं है।

क्या किसी के पास इस समस्या का कोई आसान समाधान है? या शायद एक बेहतर समग्र डिजाइन का एक विचार जो इस तरह के फ़ंक्शन नाम ओवरलोडिंग समस्याओं का उत्पादन नहीं करेगा?

कोई भी प्रतिक्रिया की सराहना की!

उत्तर

0

बजाय setParam1 की तरह कुछ करने के लिए छड़ी जेनरेटेड क्लास पर "ओवरलोड इंडेक्स" का उपयोग करने से मुझे इस समस्या को हल करने के लिए कोई अन्य व्यवहार्य तरीका नहीं मिला। इसलिए, पैकेज

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; 

इन कक्षाओं का उत्पादन होगा:

public class FAuthorExists1 { /* ... */ } 
public class FAuthorExists2 { /* ... */ } 

अन्य विचारों बस या कोड पीढ़ी के समय नए संघर्ष का कारण होता है, कार्यावधि में।

अद्यतन:

CREATE PACKAGE my_package IS 
    PROCEDURE f_author_exists (name VARCHAR2); 
    PROCEDURE f_author_exists (name CHAR); 
    PROCEDURE f_author_exists (name CHAR, country OUT VARCHAR2); 
END my_package; 

ऐसा लगता है के रूप में, अधिक भार इस तरह का PL/SQL में संभव है, भी: ध्यान दें, इस समाधान भी यह एक सही ढंग से इस तरह की स्थितियों को संभालने के लिए केवल एक ही लगता है।

3

आपका getReturnValue समारोह कॉल समय जो समारोह अतिभारित पर कितने इनपुट पैरामीटर स्थापित किए गए हैं निर्भर करता है कॉल करने के लिए पर यह समझ सकते हैं - लेकिन मुझे लगता है कि यह सरल किया जा रहा है खत्म हो जाएगा अगर आप setName

+0

'execute()' विधि वास्तविक कॉल करता है। फ़ंक्शन तर्क 'नाम' के कारण विधि को' setName() 'कहा जाता है। मैंने इसे स्पष्ट किया है, उदाहरण के लिए, इसे और स्पष्ट करने के लिए। आपका विचार खराब नहीं है। हालांकि, समस्या यह है कि यदि आपके पास बहुत अलग तर्क सेट के साथ फ़ंक्शन नाम ओवरलोडिंग है, तो यह पता लगाने में भ्रमित हो सकता है कि तर्कों का संयोजन संभव है। लेकिन सुविधा विधियों के साथ, यह वास्तव में काम कर सकता है! रन-टाइम –

+0

पर सही कॉल निर्धारित करने के विचार के लिए +1 @ नामों के बजाए तर्क प्रकारों पर मिलान करने वाले लुकास मेरे सुझाव से मेरा मतलब था - मैंने सोचा कि यह आसान हो सकता है। मुझे लगता है कि सिद्धांत में हालांकि संभव होगा। –

+0

तर्क नाम/प्रकार/स्थिति के आधार पर फ़ंक्शन को कॉल करने के तरीके पर एक अच्छा कार्यान्वयन करना आसान है। लेकिन मुश्किल हिस्सा डेवलपर्स के लिए जेनरेट कोड का उपयोग करना आसान है। यही कारण है कि मैं उत्पन्न संकेतों में तर्क का नाम –

0

आप प्रत्येक फ़ंक्शन के लिए अद्वितीय नाम देकर अधिभार की सीमाओं को पार कर सकते हैं।यह कोड की पठनीयता में भी सुधार करेगा (यह एक कारण है why Golang doesn't have overloading)। उदाहरण के लिए f_author_name_exists, f_author_name_country_exists।

जावा क्लास को जटिल बनाने वाला एक और तरीका, रनटाइम पर निर्णय लेना है कि किस प्रक्रिया को कॉल करना है, जिसके आधार पर ओवरलोड किए गए जावा कन्स्ट्रक्टर का उपयोग किया गया था या कौन से सेटर्स का उपयोग किया गया था।

+0

आपके संकेतों के लिए धन्यवाद। जैसा कि सवाल में बताया गया है, यह [jOOQ] (http://www.jooq.org) के बारे में है, एक उपयोगिता जो संग्रहित प्रक्रियाओं के लिए स्रोत कोड उत्पन्न करती है, इसलिए मेरे पास प्रक्रिया नाम ओवरलोडिंग पर नियंत्रण नहीं है - जो मैं नहीं करता हूं ' बिल्कुल बुरा मत मानो। सुविधा विधियों को बनाते समय यह एक एपीआई की अभिव्यक्ति को जोड़ता है। दूसरी तरफ, 'आउट' पैरामीटर की उपस्थिति के कारण, यह तय करना मुश्किल है कि रनटाइम पर किस प्रक्रिया को कॉल करना है, अगर कोड कॉलिंग समय पर उस कॉल को हार्ड-वायर्ड नहीं किया जाता है ... –

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