In weiteren Experimenten haben wir herausgefunden, dass die Probleme noch tiefer liegen als angenommen.
Zum Beispiel unterschiedliche Elemente, die im Paket buggy_report
verwendet werden wir können einen ORA-03113: end-of-file on communication channel
erhalten beim Ausführen des Skripts (in der Frage). Dies kann durch Ändern des Typs von t_id_table
erfolgen zu VARRAY
oder TABLE .. INDEX BY ..
. Es gibt viele Wege und Variationen, die uns zu verschiedenen Ausnahmen führen, die in diesem Beitrag nicht zum Thema gehören.
Die eine weitere interessante Sache ist die Kompilierzeit von buggy_report
Die Paketspezifikation kann bis zu 25 Sekunden dauern, normalerweise dauert es etwa 0,05 Sekunden. Ich kann definitiv sagen, dass es auf das Vorhandensein von TYPE t_id_table
ankommt Parameter in der pipe_table
Funktionsdeklaration und "Langzeitkompilierung" treten in 40 % der Installationsfälle auf. Es scheint also, dass das Problem mit local collection types in SQL
beim Kompilieren latent auftauchen.
Wir sehen also, dass Oracle 12.1.0.2 offensichtlich einen Fehler bei der Realisierung der Verwendung lokaler Sammlungstypen in SQL hat.
Die minimalen Beispiele, um ORA-22163
zu erhalten und ORA-03113
Folgen. Dort gehen wir von demselben buggy_report
aus Paket wie in der Frage.
-- 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;
/