さらなる実験で、問題は想定よりもさらに深いことがわかりました。
たとえば、パッケージ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;
/