I yderligere eksperimenter fandt vi ud af, at problemerne er endnu dybere, end det er blevet antaget.
For eksempel forskellige elementer brugt i pakken buggy_report
vi kan få en ORA-03113: end-of-file on communication channel
når du kører scriptet (i spørgsmålet). Det kan gøres ved at ændre typen af t_id_table
til VARRAY
eller TABLE .. INDEX BY ..
. Der er mange måder og variationer, der fører os til forskellige undtagelser, som er uden for emnet for dette indlæg.
Den ene mere interessante ting er kompileringstiden for buggy_report
pakkespecifikation kan tage op til 25 sekunder, når det normalt tager omkring 0,05 sekunder. Jeg kan bestemt sige, at det afhænger af tilstedeværelsen af TYPE t_id_table
parameter i pipe_table
funktionsdeklaration og "long time compilation" sker i 40% af installationssager. Så det ser ud til, at problemet med local collection types in SQL
vises latent under kompileringen.
Så vi ser, at Oracle 12.1.0.2 åbenbart har en fejl i realiseringen af brugen af lokale samlingstyper i SQL.
De minimale eksempler for at få ORA-22163
og ORA-03113
følger. Der antager vi den samme buggy_report
pakke som i spørgsmålet.
-- 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;
/