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;
/