2011-01-20 17 views
10

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

मैं फ़ंक्शन कैसे लिखूंगा और वापसी का प्रकार क्या होगा?

एक उदाहरण समारोह है कि मैं लिखा है है:

बना सकते हैं या समारोह func1 वापसी varchar2 की जगह के रूप में वापसी ('func1 से हैलो') शुरू; अंत func1;

मैं अभी भी एक बुनियादी स्तर पर हूं, तो क्या कोई मेरी चयन क्वेरी के परिणाम को वापस करने में मदद कर सकता है? मेरा मानना ​​है कि कर्सर का उपयोग किया जाना चाहिए, क्योंकि एक से अधिक पंक्ति होगी।

उत्तर

17

आम तौर पर, एक फ़ंक्शन एक "चीज़" देता है। आम तौर पर, यह एक स्केलर है (एक संख्या, एक वर्चर 2, एक रिकॉर्ड, आदि) हालांकि आप एक संग्रह वापस कर सकते हैं। तो, उदाहरण के लिए, आप एक संग्रह (इस मामले में एक नेस्टेड तालिका) सभी EMPNO मूल्यों के साथ ईएमपी तालिका

CREATE TYPE empno_tbl 
    IS TABLE OF NUMBER; 

CREATE OR REPLACE FUNCTION get_empnos 
    RETURN empno_tbl 
IS 
    l_empnos empno_tbl; 
BEGIN 
    SELECT empno 
    BULK COLLECT INTO l_empnos 
    FROM emp; 
    RETURN l_empnos; 
END; 

से लौट सकते हैं लेकिन यह एक समारोह में करने के लिए एक विशेष रूप से आम बात नहीं है। यह थोड़ा अधिक आम हो, समारोह लौटने मानों के बजाय एक कर्सर लौट अर्थात

CREATE OR REPLACE FUNCTION get_empnos2 
    RETURN SYS_REFCURSOR 
IS 
    l_rc SYS_REFCURSOR; 
BEGIN 
    OPEN l_rc 
    FOR SELECT empno 
     FROM emp; 
    RETURN l_rc; 
END; 

है और फोन करने वाले डेटा प्राप्त करने में संभाल जाने के लिए लेकिन फिर भी है कि Oracle में विशेष रूप से आम नहीं है जाएगा। जो भी आप पूरा करने की कोशिश कर रहे हैं उसके आधार पर, आम तौर पर एक ऐसा दृश्य बनाने के लिए आम बात होगी जो उस डेटा का चयन करे जिसमें आप रुचि रखते थे और उस कार्य को या कार्य करने के बजाय उस क्वेरी को क्वेरी करने के लिए।

+1

+1। साथ ही, दूसरा उदाहरण सिस्टम में काफी आम है जहां एप्लिकेशन डेटा एक्सेस संग्रहित प्रक्रियाओं के माध्यम से होता है और आम तौर पर ऐप साइड – bhangm

+0

पर iBatis जैसे कुछ के साथ संयोजन में आप आदमी हैं !! उन सरल उदाहरणों के लिए धन्यवाद। – macha

1

इस फ़ंक्शन को कॉल करने के संदर्भ के बिना, मैं आपकी मदद करने के तरीके पर थोड़ा हारा हूं।

क्या आप वाकई उप-चयन, शामिल होने या देखने के लिए बेहतर नहीं होंगे?

+1

खैर खुलकर होने के लिए, मैं सिर्फ जानने के लिए कैसे समारोह की जाएगी चाहता था। इसके उपयोग या निष्पादन इत्यादि के बावजूद मैं वर्तमान में plsql सीख रहा हूं, इसलिए मैं पंक्तियों को वापस करना चाहता था। उदाहरण के लिए – macha

2

ठीक है, अगर आप केवल सीख रहे हैं, तो आपको पाइपलाइन कार्यों के बारे में पता होना चाहिए। एक पाइपलाइन फ़ंक्शन आपको PLSQL के भीतर गतिशील रूप से जेनरेट की गई टेबल लौटा देता है।

उदाहरण के लिए ...

create function 
     gen_numbers(n in number default null) 
     return array 
     PIPELINED 
    as 
    begin 
    for i in 1 .. nvl(n,999999999) 
     loop 
     pipe row(i); 
    end loop; 
    return; 
    end; 

कौन सा मैं http://www.akadia.com/services/ora_pipe_functions.html से उधार लिया :-)

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