आगे के प्रयोगों में हमने पाया कि समस्याएँ जितनी सोची गई थीं, उससे कहीं अधिक गहरी हैं।
उदाहरण के लिए, पैकेज में उपयोग किए जाने वाले अलग-अलग तत्व buggy_report
हम एक ORA-03113: end-of-file on communication channel
प्राप्त कर सकते हैं स्क्रिप्ट चलाते समय (प्रश्न में)। यह t_id_table
. के प्रकार को बदलकर किया जा सकता है करने के लिए VARRAY
या TABLE .. INDEX BY ..
. ऐसे कई तरीके और विविधताएं हैं जो हमें अलग-अलग अपवादों की ओर ले जाती हैं, जो इस पोस्ट के विषय से हटकर हैं।
एक और दिलचस्प बात यह है कि buggy_report
. का संकलन समय पैकेज विनिर्देश में 25 सेकंड तक का समय लग सकता है, जब आम तौर पर इसमें लगभग 0.05 सेकंड लगते हैं। मैं निश्चित रूप से कह सकता हूं कि यह TYPE t_id_table
. की उपस्थिति पर निर्भर करता है pipe_table
में पैरामीटर समारोह घोषणा, और "लंबे समय तक संकलन" स्थापना मामलों के 40% में होता है। तो ऐसा लगता है कि local collection types in SQL
हाल ही में संकलन के दौरान दिखाई देते हैं।
तो हम देखते हैं कि Oracle 12.1.0.2 में स्पष्ट रूप से SQL में स्थानीय संग्रह प्रकारों का उपयोग करने में एक बग है।
ORA-22163
get प्राप्त करने के लिए न्यूनतम उदाहरण और ORA-03113
अनुसरण कर रहे हैं। वहां हम वही मान लेते हैं buggy_report
प्रश्न के अनुसार पैकेज।
-- produces 'ORA-03113: end-of-file on communication channel'
DECLARE
l_cur buggy_report.t_info_cur;
FUNCTION get_it RETURN buggy_report.t_info_cur IS BEGIN RETURN buggy_report.get_cursor(); END;
BEGIN
l_cur := get_it();
dbms_output.put_line('');
END;
/
-- produces 'ORA-22163: left hand and right hand side collections are not of same type'
DECLARE
l_cur buggy_report.t_info_cur;
PROCEDURE hello IS BEGIN NULL; END;
BEGIN
l_cur := buggy_report.get_cursor;
-- comment `hello` and exception disappears
hello;
CLOSE l_cur;
END;
/