एक पाइपलाइन तालिका फ़ंक्शन जो आप चाहते हैं उसके लिए बेहतर फिट लगता है, खासकर यदि आप जो कर रहे हैं वह डेटा पुनर्प्राप्त कर रहा है। देखें http://www.oracle-base.com/ article/misc/pipelinened-table-functions.php
आप जो करते हैं वह आपकी आउटपुट पंक्ति के लिए एक प्रकार बनाता है। तो आपके मामले में आप इस तरह के रूप में एक वस्तु का निर्माण करेंगे
CREATE TYPE get_data_faster_row AS OBJECT(
seq NUMBER(15,2),
value VARCHAR2(10),
item VARCHAR2(10)
);
फिर एक टेबल टाइप बनाएं जो ऊपर आपकी पंक्ति प्रकार से बनी एक टेबल हो
CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;
फिर अपना टेबल फ़ंक्शन बनाएं जो डेटा को पाइपलाइन तरीके से लौटाता है। Oracle में पाइपलाइन .net में यील्ड रिटर्न की तरह है (सुनिश्चित नहीं है कि आप इससे परिचित हैं)। आप सभी पंक्तियों को ढूंढते हैं जो आप चाहते हैं और उन्हें एक बार में एक लूप में "पाइप" करें। जब आपका फ़ंक्शन उस तालिका को पूरा करता है जो लौटाई जाती है तो उसमें आपके द्वारा पाइप की गई सभी पंक्तियां होती हैं।
CREATE FUNCTION Get_Data_Faster(params) RETURN get_data_faster_data PIPELINED AS
BEGIN
-- Iterate through your parameters
--Iterate through the results of the select using
-- the current parameters. You'll probably need a
-- cursor for this
PIPE ROW(get_data_faster_row(seq, value, item));
LOOP;
LOOP;
END;
संपादित करें:नीचे एलेक्स की टिप्पणी के बाद, आपको ऐसा कुछ चाहिए। मैं इसका परीक्षण नहीं कर पाया, लेकिन इससे आपको शुरुआत करनी चाहिए:
CREATE FUNCTION Get_Data_Faster(in_seq_numbers IN seq_numbers_array, in_values IN text_array, in_items IN text_array, list IN VARCHAR2) RETURN get_data_faster_data PIPELINED AS
TYPE r_cursor IS REF CURSOR;
query_results r_cursor;
results_out get_data_faster_row := get_data_faster_row(NULL, NULL, NULL);
query_str VARCHAR2(4000);
seq_number NUMBER;
the_value VARCHAR2(10);
the_item VARCHAR2(10);
BEGIN
FOR i IN 1..in_seq_number.COUNT
LOOP
seq_number := in_seq_numbers(i);
the_value := trim(in_values(i));
the_item := trim(in_items(i));
query_str := 'SELECT distinct '||seq_number||' as seq, value, item
FROM my_table ai';
query_str := query_str || '
WHERE ai.value = '''||the_value||''' AND ai.item = '''||the_item||'''
AND ai.param = ''BOOK''
AND ai.prod in (' || list || ');
OPEN query_results FOR query_str;
LOOP
FETCH query_results INTO
results_out.seq,
results_out.value,
results_out.item;
EXIT WHEN query_results%NOTFOUND;
PIPE ROW(results_out);
END LOOP;
CLOSE query_results;
END LOOP;
END;
उत्तर के लिए उपयोगी एलेक्स की टिप्पणी से अतिरिक्त जानकारी: