Trong các thử nghiệm sâu hơn, chúng tôi phát hiện ra rằng các vấn đề thậm chí còn sâu hơn những gì nó được giả định.
Ví dụ:các phần tử khác nhau được sử dụng trong gói buggy_report
chúng ta có thể nhận được ORA-03113: end-of-file on communication channel
khi chạy script (trong câu hỏi). Nó có thể được thực hiện với việc thay đổi loại t_id_table
thành VARRAY
hoặc TABLE .. INDEX BY ..
. Có rất nhiều cách và các biến thể dẫn chúng ta đến các trường hợp ngoại lệ khác nhau, điều này không chủ đề với bài đăng này.
Một điều thú vị nữa là thời gian biên dịch của buggy_report
đặc điểm kỹ thuật gói có thể mất đến 25 giây, trong khi thông thường mất khoảng 0,05 giây. Tôi chắc chắn có thể nói rằng nó phụ thuộc vào sự hiện diện của TYPE t_id_table
trong pipe_table
khai báo hàm và "biên dịch thời gian dài" xảy ra trong 40% trường hợp cài đặt. Vì vậy, có vẻ như vấn đề với local collection types in SQL
xuất hiện tiềm ẩn trong quá trình biên dịch.
Vì vậy, chúng tôi thấy rằng Oracle 12.1.0.2 rõ ràng có một lỗi trong việc thực hiện sử dụng các kiểu thu thập cục bộ trong SQL.
Các ví dụ tối thiểu để lấy ORA-22163
và ORA-03113
là sau. Ở đó, chúng tôi giả định cùng một buggy_report
gói như trong câu hỏi.
-- 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;
/