Dans d'autres expériences, nous avons découvert que les problèmes sont encore plus profonds qu'on ne le pensait.
Par exemple, différents éléments utilisés dans le package buggy_report
on peut obtenir un ORA-03113: end-of-file on communication channel
lors de l'exécution du script (dans la question). Cela peut être fait en changeant le type de t_id_table
à VARRAY
ou TABLE .. INDEX BY ..
. Il existe de nombreuses manières et variations qui nous conduisent à différentes exceptions, qui sont hors sujet pour cet article.
La chose la plus intéressante est que le temps de compilation de buggy_report
La spécification de l'emballage peut prendre jusqu'à 25 secondes, alors qu'elle prend normalement environ 0,05 seconde. Je peux certainement dire que cela dépend de la présence de TYPE t_id_table
paramètre dans le pipe_table
la déclaration de fonction et la "compilation longue durée" se produisent dans 40 % des cas d'installation. Il semble donc que le problème avec les local collection types in SQL
apparaissent de manière latente lors de la compilation.
Nous voyons donc qu'Oracle 12.1.0.2 a évidemment un bogue dans la réalisation de l'utilisation des types de collections locales en SQL.
Les exemples minimaux pour obtenir ORA-22163
et ORA-03113
sont les suivantes. Là, nous supposons le même buggy_report
paquet comme dans la question.
-- 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;
/