2012-11-21 15 views
8

यह मेरी निरंतर निराशा है कि ओरेकल पीएल/एसक्यूएल bool डेटा-प्रकार का समर्थन करता है, जबकि ओरेकल एसक्यूएल नहीं करता है। जब आप पीएल/एसक्यूएल बूलियन रिटर्न-वैल्यू को अपने रोज़ाना एसक्यूएल (नीचे उदाहरण) में वापस संसाधित करना चाहते हैं तो यह प्रोवर्बियल में एक बड़ा दर्द है।बूल समर्थन ओरेकल एसक्यूएल

यहां तक ​​कि पूछे जाने वाले टॉम वेबसाइट भी इस मिस्फीट के बारे में ब्लेज़ है, यह रिपोर्ट करते हुए कि आपको बूलियन कॉलम को निश्चित मूल्य 'Y'/'N' CHAR कॉलम के रूप में कोड करना चाहिए, जो कि इतने सारे अलग-अलग स्तरों पर इतना खराब पुलिस-आउट उत्तर है जो मैं नहीं करता पता है कि इसकी आलोचना कहां शुरू करें। वास्तव में, इस प्रतिक्रिया की एकमात्र रिडीमिंग गुणवत्ता तथ्य यह है कि (जहां तक ​​मैंने हाल ही में खोज की है), कई अन्य डेटाबेस-इंजन बुलियन डेटा-प्रकार का समर्थन नहीं करते हैं।

किसी भी तरह - सवाल ...

मैं एक काम के आसपास निम्नलिखित समस्या के लिए (गन्दा और वर्बोज़ यद्यपि) है, तो मैं जिज्ञासा के बजाय आवश्यकता के इस सवाल पूछ रहा हूँ। लेकिन कुछ चीजों में से एक जो मुझे आश्चर्यचकित करता है वह चालाक प्रोग्रामर की सरलता है, इसलिए यहां उम्मीद है कि आप में से एक निम्नलिखित के समाधान के साथ आ सकता है।

निम्नलिखित नमूने में, समारोह stock_pkg.is_in_stock() (जो अपने आवेदन का एक अंतर्निहित हिस्सा है) एक बूल मान देता है, एसक्यूएल अमान्य (याद एसक्यूएल BOOL समर्थन नहीं करता) प्रतिपादन:

SELECT part_no, stock_pkg.is_in_stock(part_no) in_stock 
FROM parts_table 

मैं क्या जरूरत है इसके बाद के संस्करण समारोह-कॉल का उपयोग कर प्रारूप का एक मान्य स्ट्रिंग (varchar) उत्पादन उत्पन्न करने के लिए करने का एक तरीका मिल रहा है:

PART_NO IN_STOCK 
------- ------------ 
AA  YES 
BB  NO 
CC  NO 

(आप के लिए सही/गलत 'हां/नहीं' स्थानापन्न कर सकते हैं ',' हरा/लाल ',' टोरी/श्रम 'या यहां तक ​​कि संख्यात्मक 1/0 की सभी देखभाल के लिए - बस इतनी देर तक आउटपुट दो अलग-अलग श्रेणियों में से एक में आता है।)

दुर्भाग्यवश, मुझे मूल कार्य को फिर से लिखने का विशेषाधिकार नहीं है अलग डेटा प्रकार। और इसके अलावा, इस तरह के हजारों कार्य बड़े अनुप्रयोग के चारों ओर बिखरे हुए हैं, जिससे उन्हें सभी को फिर से लिखना अव्यवहारिक बना देता है।

तो इस अर्थ में, समाधान एक 'जेनेरिक' होना चाहिए (यानी इस फ़ंक्शन कॉल के लिए विशिष्ट नहीं है)। उदाहरण के लिए, फ़ंक्शन को stock_pkg.is_in_stock_chr() के रूप में फिर से लिखना पर्याप्त नहीं है, क्योंकि इसका मतलब है कि मेरे आवेदन में अन्य सभी समान कार्यों को फिर से लिखना होगा।

मैं पहले से ही की कोशिश की है:

SELECT part_no, 
     CASE WHEN stock_pkg.is_in_stock(part_no) THEN 'y' ELSE 'n' END in_stock 
FROM parts_table 

और यहां तक ​​कि अपने खुद के आवरण समारोह:

SELECT part_no, 
     my_bool_to_str(stock_pkg.is_in_stock(part_no)) in_stock 
FROM parts_table 

लेकिन फिर भी अन्य कार्यात्मक निर्माणों के अंदर बूलियन्स लपेटकर प्रतीत नहीं होता Oracle SQL (द्वारा की अनुमति दी कम से कम ओरेकल 10 जी में नहीं)।

in_stock कॉलम के अंदर एक उप-चयन लिखने का विकल्प भी है, लेकिन यह अत्यधिक उदाहरणों में अत्यधिक जटिल हो सकता है, और यह केस-विशिष्ट भी होगा।

जैसा कि मैंने कहा, मुझे उम्मीद है कि वहां कहीं भी एक सरल समाधान है (या कम से कम एक बहुत ही सरल जिसे मैंने अनदेखा किया है)।

आपके समय के लिए धन्यवाद।

+0

पहचान नहीं करता है यह मेरे लिए स्पष्ट नहीं है कि आपका प्रश्न क्या है। क्या आप एक एसएलएल मान को पीएल/एसक्यूएल बूलियन डेटा प्रकार में वापस करने के लिए पूछ रहे हैं? –

+0

@ डेविड एल्ड्रिज: मैं पूछ रहा हूं कि एक पीएल/एसक्यूएल बूलियन डेटा-प्रकार (पीएल/एसक्यूएल फ़ंक्शन से लौटाया गया) को रन-ऑफ-द-मिल एसक्यूएल क्वेरी में कैसे लौटाया जाए। मेरे पास एक साधारण एसक्यूएल-क्वेरी प्लेटफार्म है जिसे इस पीएल/एसक्यूएल-जेनरेटेड बूलियन वैल्यू के मूल्य को अंत उपयोगकर्ता को वापस करने की आवश्यकता है। – cartbeforehorse

उत्तर

6

आप इस तरह अपने खुद के आवरण लिख सकते हैं:

CREATE OR REPLACE FUNCTION my_bool_to_str(f varchar2) RETURN VARCHAR2 IS 

    b varchar2(2); 

BEGIN 

    EXECUTE IMMEDIATE 'declare bl boolean; begin bl := ' || f || 
        '; if bl then :1 := ''y''; else :1 := ''n''; end if; end;' 
    using out b; 

    return b; 

END; 

तो फिर तुम इसे इस तरह कॉल कर सकते हैं:

SELECT part_no, 
     my_bool_to_str('stock_pkg.is_in_stock('|| part_no|| ')') in_stock 
FROM parts_table 

अपने आवरण से अंतर यह है कि यह इनपुट और नहीं के रूप में एक varchar हो जाता है एक बुलियन जो एसक्यूएल इंजन

+1

यह कामकाज स्मार्ट है, लेकिन वास्तव में बाइंड्स की आवश्यकता है =) –

+0

फिक्स @VincentMalgrat के लिए धन्यवाद! –

+0

मुझे नहीं लगता था कि आप 'निष्पादित तत्काल' या 'dbms_sql' के साथ बूलियन बांध सकते हैं। मुझे ओआरए -00457 मिल गया है, जैसा कि मैंने अपने पहले स्टैब के साथ किया था। क्या मैं कुछ भूल रहा हूँ? –

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