В по-нататъшни експерименти открихме, че проблемите са дори по-дълбоки, отколкото се предполагаше.
Например различни елементи, използвани в пакета buggy_report
можем да получим ORA-03113: end-of-file on communication channel
при стартиране на скрипта (във въпроса). Може да се направи с промяна на типа на t_id_table
към VARRAY
или TABLE .. INDEX BY ..
. Има много начини и варианти, които ни водят до различни изключения, които не са по темата за тази публикация.
Едно по-интересно нещо е времето за компилиране на buggy_report
спецификацията на пакета може да отнеме до 25 секунди, когато обикновено отнема около 0,05 секунди. Определено мога да кажа, че зависи от наличието на TYPE t_id_table
параметър в pipe_table
декларация на функция и "дълго време компилиране" се случват в 40% от случаите на инсталиране. Така че изглежда, че проблемът с local collection types in SQL
латентно се появяват по време на компилирането.
Така че виждаме, че Oracle 12.1.0.2 очевидно има грешка в реализацията на използването на типове локални колекции в SQL.
Минималните примери за получаване на ORA-22163
и ORA-03113
следват. Там приемаме същия buggy_report
пакет като във въпроса.
-- 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;
/