W dalszych eksperymentach odkryliśmy, że problemy są jeszcze głębsze, niż zakładano.
Na przykład różne elementy użyte w pakiecie buggy_report
możemy uzyskać ORA-03113: end-of-file on communication channel
podczas uruchamiania skryptu (w pytaniu). Można to zrobić zmieniając typ t_id_table
do VARRAY
lub TABLE .. INDEX BY ..
. Istnieje wiele sposobów i odmian prowadzących nas do różnych wyjątków, które nie są tematem tego posta.
Jeszcze jedną interesującą rzeczą jest czas kompilacji buggy_report
Specyfikacja pakietu może potrwać do 25 sekund, podczas gdy zwykle zajmuje to około 0,05 sekundy. Z całą pewnością mogę powiedzieć, że zależy to od obecności TYPE t_id_table
parametr w pipe_table
deklaracja funkcji i "długa kompilacja" zdarzają się w 40% przypadków instalacji. Wygląda więc na to, że problem z local collection types in SQL
pojawiają się utajone podczas kompilacji.
Widzimy więc, że Oracle 12.1.0.2 ma oczywiście błąd w realizacji lokalnych typów kolekcji w SQL.
Minimalne przykłady do pobrania ORA-22163
i ORA-03113
podążać. Tam zakładamy ten sam buggy_report
pakiet jak w pytaniu.
-- 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;
/