V dalších experimentech jsme zjistili, že problémy jsou ještě hlubší, než se předpokládalo.
Například různé prvky použité v balíčku buggy_report
můžeme získat ORA-03113: end-of-file on communication channel
při spuštění skriptu (v otázce). To lze provést změnou typu t_id_table
na VARRAY
nebo TABLE .. INDEX BY ..
. Existuje mnoho způsobů a variant, které nás vedou k různým výjimkám, které jsou mimo téma tohoto příspěvku.
Ještě zajímavá věc je doba kompilace buggy_report
specifikace balíčku může trvat až 25 sekund, zatímco normálně to trvá asi 0,05 sekundy. Rozhodně mohu říci, že to závisí na přítomnosti TYPE t_id_table
parametr v pipe_table
deklarace funkce a „dlouhodobá kompilace“ se děje ve 40 % případů instalace. Zdá se tedy, že problém s local collection types in SQL
se latentně objeví během kompilace.
Vidíme tedy, že Oracle 12.1.0.2 má zjevně chybu v realizaci používání lokálních typů kolekcí v SQL.
Minimální příklady k získání ORA-22163
a ORA-03113
sledují. Tam předpokládáme stejný buggy_report
balíček jako v otázce.
-- 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;
/