クエリで正しい where 述語が常に使用されるよう適切に奨励するために、Oracle の一部の通常のビューに「パラメータ化されたビュー」を重ねることを決定しました。
反復コード (適切に結合されたテーブル) の大部分がビューに表示されるため、共通の結合とフィルターの独自のコピーを使用する多くの異なるプロシージャーと関数を使用する必要がなくなります。
次に、これらのビューにパイプライン化されたテーブル関数をレイヤー化して、ビューが「すべての時間と空間で」呼び出されないように、呼び出し元が必要なフィルターを確実に提供するようにします。私は sys_context と userenv と package 変数を使用する代替案を調べました。それらは Oracle ユーザーがパラメータ化されたビューと呼んでいるように見えますが、ビューが使用されるたびにそれらのシムをビューの周りに配置することは単に実行可能ではなく、再利用できません自己結合します。
StackOverflow を含むさまざまな場所で、これについて多くのことを読みました。
ORACLE 11g のテーブル値関数? (パラメータ化されたビュー)
パイプライン化されたPL/SQL表関数内でSELECTを使用できますか?
これは、多くのクエリが繰り返されて無秩序になったアプリケーションの保守性を改善しようとするアーキテクチャ上の決定です。ビューはある程度は役に立ちますが、呼び出し元に述語を強制して、呼び出し元がばかげたことをするのを止める方法がないのではないかと心配しています。
私は SQL Server でインライン テーブル値関数を使用してこの手法を使用して大きな成功を収めました。コードが少なくなったため、システムの一貫性が大幅に向上し、依存関係と提案された変更の影響を追跡しやすくなりました。 b) より多くの再利用とより少ない繰り返し。
最後のリンクについて少し心配です。これらのパイプライン化されたテーブル関数のいずれかに参加し、それを使用して別のテーブルを更新すると、同時実行性またはタイミングの問題が発生する可能性があることを暗示しているようです。
パイプライン化されたテーブル関数の経験と、私が注意する必要があることを教えてください。また、より良い代替手段がある場合は、あなたの答えでも教えてください。