長い話を簡単にするために、私は以下に示すコードについて議論することを提案します。Oracle 12はSQLのローカルコレクション型に問題がありますか?
それを実行している場合:
「PLS: " 'PIPE_TABLE' に間違った番号または呼び出しの引数のヒントの種類PLS-00306"
オラクル11コンパイラは
を上げます-00642:SQL文で許可されていないローカルコレクション型 "
オラクル12は、そのような警告で次のパッケージをコンパイルしますが、私たちは、ランタイムでの驚きを持っている
あるとして、匿名ブロックを実行する - すべてが正常であるが (我々は、パイプ
pipe_table
機能で一部の行があり - それはdoesnの左手と右手のコレクションは同じではありません。「tは私たちは、「ORA-22163を取得し、今のは
hello;
と行のコメントを解除またはそこに任意の手続きへの呼び出しを入れてみましょう、と再び を変更anonumousブロックを実行)影響を与えますタイプ "
質問: Oracle 12ではSQLでローカルコレクション型を使用できますか? の場合、PACKAGE buggy_report
のコードに何が問題なのですか?
CREATE OR REPLACE PACKAGE buggy_report IS
SUBTYPE t_id IS NUMBER(10);
TYPE t_id_table IS TABLE OF t_id;
TYPE t_info_rec IS RECORD (first NUMBER);
TYPE t_info_table IS TABLE OF t_info_rec;
TYPE t_info_cur IS REF CURSOR RETURN t_info_rec;
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED;
FUNCTION get_cursor RETURN t_info_cur;
END buggy_report;
/
CREATE OR REPLACE PACKAGE BODY buggy_report IS
FUNCTION pipe_table(p t_id_table) RETURN t_info_table PIPELINED IS
l_table t_id_table;
BEGIN
l_table := p;
END;
FUNCTION get_cursor RETURN t_info_cur IS
l_table t_id_table;
l_result t_info_cur;
BEGIN
OPEN l_result FOR SELECT * FROM TABLE (buggy_report.pipe_table(l_table));
RETURN l_result;
END;
END;
/
DECLARE
l_cur buggy_report.t_info_cur;
l_rec l_cur%ROWTYPE;
PROCEDURE hello IS BEGIN NULL; END;
BEGIN
l_cur := buggy_report.get_cursor();
-- hello;
LOOP
FETCH l_cur INTO l_rec;
EXIT WHEN l_cur%NOTFOUND;
END LOOP;
CLOSE l_cur;
dbms_output.put_line('success');
END;
/
例には、2つの異常なOracle機能(ローカル収集とパイプライン機能)が含まれています。 「Oracleにはパイプライン機能を持つバグがあります」と言うだけで有効です。私の経験では、パイプライン関数を使用する実装では通常、問題が発生します。 Oracleバグのためか、行単位の処理の制限のために発生します。 –