I ytterligare experiment fick vi reda på att problemen är ännu djupare än det har antagits.
Till exempel, olika element som används i paketet buggy_report
vi kan få en ORA-03113: end-of-file on communication channel
när du kör skriptet (i frågan). Det kan göras genom att ändra typen av t_id_table
till VARRAY
eller TABLE .. INDEX BY ..
. Det finns många sätt och variationer som leder oss till olika undantag, som är utanför ämnet för det här inlägget.
En mer intressant sak är kompileringstiden för buggy_report
paketspecifikationen kan ta upp till 25 sekunder, när det normalt tar cirka 0,05 sekunder. Jag kan definitivt säga att det beror på närvaron av TYPE t_id_table
parametern i pipe_table
funktionsdeklaration och "långtidskompilering" sker i 40 % av installationsfallen. Så det verkar som om problemet med local collection types in SQL
visas latent under kompileringen.
Så vi ser att Oracle 12.1.0.2 uppenbarligen har en bugg i realiseringen av att använda lokala samlingstyper i SQL.
De minimala exemplen för att få ORA-22163
och ORA-03113
följer. Där antar vi samma buggy_report
paket som i frågan.
-- 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;
/