Dalam eksperimen lebih lanjut, kami menemukan bahwa masalah bahkan lebih dalam dari yang diperkirakan.
Misalnya, berbagai elemen yang digunakan dalam paket buggy_report kita bisa mendapatkan ORA-03113: end-of-file on communication channel saat menjalankan skrip (dalam pertanyaan). Hal ini dapat dilakukan dengan mengubah jenis t_id_table ke VARRAY atau TABLE .. INDEX BY .. . Ada banyak cara dan variasi yang mengarahkan kita ke pengecualian yang berbeda, yang di luar topik postingan ini.
Satu hal lagi yang menarik adalah waktu kompilasi buggy_report spesifikasi paket bisa memakan waktu hingga 25 detik, padahal biasanya dibutuhkan sekitar 0,05 detik. Saya pasti dapat mengatakan bahwa itu tergantung pada keberadaan TYPE t_id_table parameter di pipe_table deklarasi fungsi, dan "kompilasi lama" terjadi pada 40% kasus instalasi. Jadi sepertinya ada masalah dengan local collection types in SQL muncul secara laten selama kompilasi.
Jadi kita melihat bahwa Oracle 12.1.0.2 jelas memiliki bug dalam realisasi penggunaan tipe koleksi lokal di SQL.
Contoh minimal untuk mendapatkan ORA-22163 dan ORA-03113 mengikuti. Di sana kita mengasumsikan buggy_report yang sama paket seperti pada pertanyaan.
-- 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;
/