In ulteriori esperimenti abbiamo scoperto che i problemi sono ancora più profondi di quanto si pensasse.
Ad esempio, elementi variabili utilizzati nel pacchetto buggy_report
possiamo ottenere un ORA-03113: end-of-file on communication channel
durante l'esecuzione dello script (nella domanda). Può essere fatto cambiando il tipo di t_id_table
a VARRAY
o TABLE .. INDEX BY ..
. Ci sono molti modi e varianti che ci portano a diverse eccezioni, che sono fuori tema per questo post.
L'unica cosa interessante è il tempo di compilazione di buggy_report
le specifiche del pacchetto possono richiedere fino a 25 secondi, quando normalmente ci vogliono circa 0,05 secondi. Posso sicuramente dire che dipende dalla presenza di TYPE t_id_table
parametro nella pipe_table
dichiarazione di funzione e "compilazione a lungo termine" si verificano nel 40% dei casi di installazione. Quindi sembra che il problema con local collection types in SQL
appaiono latenti durante la compilazione.
Quindi vediamo che Oracle 12.1.0.2 ha ovviamente un bug nella realizzazione dell'utilizzo di tipi di raccolta locali in SQL.
Gli esempi minimi per ottenere ORA-22163
e ORA-03113
stanno seguendo. Lì assumiamo lo stesso buggy_report
pacchetto come nella domanda.
-- 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;
/