एक लंबी कहानी कम करने के लिए मैं नीचे दिए गए कोड पर चर्चा करने का प्रस्ताव करता हूं।क्या ओरेकल 12 में एसक्यूएल में स्थानीय संग्रह प्रकारों में समस्याएं हैं?
इसे चलाने जब: "
:" 'PIPE_TABLE' के लिए गलत नंबर या कॉल में तर्क सुझावों के प्रकार PLS-00,306 "PLS
ओरेकल 11 संकलक
को जन्म देती है -00642: स्थानीय संग्रह प्रकार एसक्यूएल स्टेटमेंट में अनुमत नहीं है "
ओरेकल 12 ऐसी कोई चेतावनी के साथ निम्नलिखित पैकेज संकलित है, लेकिन हम क्रम में एक आश्चर्य है
जब गुमनाम ब्लॉक को क्रियान्वित करने के रूप में है - सब कुछ ठीक है (हम पाइप
अबpipe_table
समारोह में कुछ पंक्तियां सकता है - ऐसा नहीं 'टी को प्रभावित)के
hello;
के साथ लाइन uncomment या वहाँ किसी भी प्रक्रिया के लिए एक कॉल कर दिया, और फिर बदल anonumous ब्लॉक चलाने पर हम पाते हैं "ORA-22,163 करते हैं: बाएं हाथ और दाहिने हाथ की ओर संग्रह उसी के नहीं हैं टाइप करें "
और सवाल यह है: क्या ओरेकल 12 स्थानीय संग्रह प्रकारों को एसक्यूएल में अनुमति देता है? यदि हां तो PACKAGE buggy_report
के कोड के साथ क्या गलत है?
CREATE OR REPLACE PACKAGE buggy_report IS
SUBTYPE t_id IS NUMBER(10);
TYPE t_id_table IS TABLE OF t_id;
TYPE t_info_rec IS RECORD (first NUMBER);
TYPE t_info_table IS TABLE OF t_info_rec;
TYPE t_info_cur IS REF CURSOR RETURN t_info_rec;
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED;
FUNCTION get_cursor RETURN t_info_cur;
END buggy_report;
/
CREATE OR REPLACE PACKAGE BODY buggy_report IS
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED IS
l_table t_id_table;
BEGIN
l_table := p;
END;
FUNCTION get_cursor RETURN t_info_cur IS
l_table t_id_table;
l_result t_info_cur;
BEGIN
OPEN l_result FOR SELECT * FROM TABLE (buggy_report.pipe_table(l_table));
RETURN l_result;
END;
END;
/
DECLARE
l_cur buggy_report.t_info_cur;
l_rec l_cur%ROWTYPE;
PROCEDURE hello IS BEGIN NULL; END;
BEGIN
l_cur := buggy_report.get_cursor();
-- hello;
LOOP
FETCH l_cur INTO l_rec;
EXIT WHEN l_cur%NOTFOUND;
END LOOP;
CLOSE l_cur;
dbms_output.put_line('success');
END;
/
उदाहरणों में दो असामान्य ओरेकल विशेषताएं शामिल हैं - स्थानीय संग्रह और पाइपलाइन फ़ंक्शन। यह कहने के लिए मान्य हो सकता है "ओरेकल में पाइपलाइन कार्यों के साथ एक बग है"। मेरे अनुभव कार्यान्वयन में जो पाइपलाइन कार्यों का उपयोग करते हैं, वे आमतौर पर परेशानियों के लिए जा रहे हैं; या तो ओरेकल कीड़े या पंक्ति-दर-पंक्ति प्रसंस्करण की सीमाओं के कारण। –