2009-10-19 10 views
8

में किसी ऑब्जेक्ट प्रकार का उपयोग किसी ऑब्जेक्ट प्रकार का उपयोग करना मेरे पास एक ऐसा फ़ंक्शन है जो 3 ऑब्जेक्ट्स देता है। क्या उस फ़ंक्शन को एक चयनित कथन से कॉल करने का कोई तरीका है और प्रत्येक मान एक अलग कॉलम है? मैं इसे 3 कार्यों में तोड़ सकता हूं, लेकिन मान संबंधित हैं इसलिए मैं इसे प्रदर्शन कारणों से एक के रूप में रखना चाहता था। (तो ओरेकल क्वेरी में प्रत्येक पंक्ति के लिए 3 बहुत समान जटिल कार्य कॉल करने के लिए नहीं है।) के लिएओरेकल

तो:

create type test_obj is object ( 
a NUMBER, 
b NUMBER, 
c NUMBER); 

    create or replace function test_func (
    pinput NUMBER) 
    return test_obj 
    as 
    begin 
    return test_obj(0, 0, 0); 
    end test_func; 

मैं चाहूँगा कुछ चुने हुए बयान से test_func कॉल करने के लिए सक्षम होने के लिए , लेकिन फ़ंक्शन को कई बार कॉल किए बिना, ए, बी, और सी अलग कॉलम हैं। मैं शायद कुछ इस तरह सोचा है, लेकिन यह काम नहीं करता है:

select 
    iv.col1, 
    iv.col2, 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     mt.col1, 
     mt.col2, 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

वहाँ Oracle 10g में इस तरह कुछ भी करने के लिए एक रास्ता है, या वहाँ इस समस्या को हल करने के लिए एक बेहतर तरीका है?

उत्तर

9

प्रश्न में चयन कथन काम करेगा। यह असफल रहा क्योंकि मैंने इनलाइन व्यू के लिए उपनाम शामिल नहीं किया था।

किसी कारण से यह काम करेगा:

select 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

लेकिन यह ऐसा नहीं करेंगे:

select 
    func_data.a, 
    func_data.b, 
    func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) 
+0

धन्यवाद! इससे मेरी मदद की। – filiprem

+1

समस्या सिर्फ नाम संकल्प के साथ है। ओरेकल हमेशा SELECT कथन में डॉट से पहले तालिका-उपनाम या डेटाबेस में समानार्थी/पैकेज के रूप में पहले भाग को व्याख्या करता है। यह सभी कॉलम भी नहीं देखता है। तो आपको table_alias.column.attribute के साथ नाम को पूरी तरह अर्हता प्राप्त करनी होगी – Falco

2

तालिका उर्फ ​​एक नामित परिणाम सेट संदर्भ है, जो काम करने के लिए सक्षम बनाता है परिणाम में परिणाम देता है एक वस्तु उदाहरण के रूप में। उपनाम के बिना, यह विफल रहता है क्योंकि कास्टिंग ऑब्जेक्ट प्रकार के उदाहरणों को उनके स्वयं के स्पष्ट संदर्भ के बिना संभाल नहीं पाता है, जो प्रभावी रूप से तालिका उपनाम है।