パイプライン化された関数のドキュメントには、SQL ステートメント (通常は ) で使用される場合、DML は許可されないと記載されていますSELECT
。ほとんどの例では、パイプライン化された関数はデータの生成または変換 (パラメーターとして顧客を受け入れる) に使用されますが、発行は行われません。 DML ステートメント。
現在、技術的には、Oracle からのエラーなしで SELECT を使用できます ( ORA 14551は発生しません)。ただし、選択の再現可能な奇妙な動作を経験しています。PRAGMA AUTONOMOUS_TRANSACTION
が使用されていなくても、によって取得された行は、常に現在のローカル トランザクションを考慮していないSELECT
ように見えます。これは、私にはバグのように感じます。さらに気がかりなことは、分散トランザクションを使用する場合 (たとえば、ローカル トランザクションではなく ORAMTS を介して)、トランザクションが使用されるという事実です。
編集: 結局のところ、奇妙な効果は、クエリ内のいくつかの WITH ステートメントに関連しているように見えますが、動作する場合と動作しない場合があります (少なくとも 10g では、Oracle オプティマイザーの現在の気分によって異なります)。場合によっては、ORA-32036 が表示されることがありますが、コードをまったく変更しないと発生しません。現在、ORA-32036 で失敗することがあるクエリは、正しいトランザクションの使用にも失敗しているクエリであり、パイプライン関数とは無関係である可能性があります。
したがって、私の具体的な質問は次のとおりです。
SELECT
パイプライン化されたテーブル関数の s が許可されているかどうか、およびそれらのトランザクションコンテキストは何か、できれば公式の声明はありますか?SQL ステートメントで使用できる一般的に使用されるクエリをモジュール化する別の方法はあります
TABLE()
か (テーブル関数で使用できるように)。誰かがそのような行動を経験したことがあり、それについてもっと知っていますか? メタリンクを調べましたが、残念ながらこのトピックに関する特定の情報は見つかりませんでした。