さらなる実験で、問題は想定よりもさらに深いことがわかりました。
たとえば、パッケージbuggy_reportで使用されるさまざまな要素 ORA-03113: end-of-file on communication channelを取得できます スクリプトを実行するとき(質問内)。 t_id_tableのタイプを変更することで実行できます VARRAYへ またはTABLE .. INDEX BY .. 。さまざまな例外につながる方法やバリエーションはたくさんありますが、この投稿ではトピックから外れています。
もう1つ興味深いのは、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;
/