データベースの列を別の列の集計で自動的に更新したいのですが。関連するテーブルは3つあります。
T_RIDER
RIDER_ID
TMP_PONYLIST
...
T_RIDER_PONY
RIDER_ID
PONY_ID
T_PONY
PONY_ID
PONY_NAME
...
T_RIDERを介してn:mの関係T_PONYがありますT_RIDER_PONY。
T_RIDERさらにT_PONYいくつかの列がありますが、ここでのみTMP_PONYLIST関連PONY_NAMEします。
TMP_PONYLISTのセミコロンで区切られたリストです。のPONY_NAMESようなものを想像してください"Twisty Tail;Candy Cane;Lucky Leaf"。何が起こっても、このフィールドを最新の状態に保ちたいと思いT_RIDER_PONYますT_PONY。
私の最初のアイデアは、トリガーをオンにすることでしT_RIDER_PONYたT_PONY。T_RIDER_PONY問題は、トリガー内で読み取ることが不可能であるように思われることです。私は常にを取得しORA-04091ます。3つのトリガーとパッケージ変数を操作するためのヒントをいくつか見つけましたが、これは非常に複雑に聞こえます。
TMP_PONYLISTスキーマを変更するか、完全に削除したほうがいいと思うかもしれません。これらはオプションですが、この質問のトピックではありません。今のところ、アプリケーションに変更を加える必要のない回答にのみ関心があります(アプリケーションはテーブルを直接操作せず、ビューのみを操作するため、ビューを使ったトリックは許可されます)。
TMP_PONYLISTでは、どうすれば自動的に最新の状態に保つことができますか?文字列を連結する方法は興味深いサブ問題であり、私もまだエレガントな解決策を見つけていません。
Oracle Database 10gEnterpriseEditionリリース10.2.0.4.0-64biを使用しています。
アップデート
マテリアライズドビューを使用するというアイデアが好きです。私が持っているのは:
CREATE MATERIALIZED VIEW
V_TMP_PONYLIST
BUILD IMMEDIATE
REFRESH COMPLETE ON COMMIT
AS SELECT
R.RIDER_ID, string_agg(P.PONY_NAME) AS TMP_PONYLIST
FROM
T_PONY P, T_RIDER R, T_RIDER_PONY RP
WHERE
P.PLOTGROUP_ID=RP.PLOTGROUP_ID AND
R.QUEUE_ID=RP.QUEUE_ID
GROUP BY R.RIDER_ID;
string_agg長いので表示されていませんが、関係ないと思います。
でコンパイルされませんON COMMIT、私は取得しORA-12054ます。ドキュメントの集計はでのみ禁止されていることを理解している
REFRESH FASTので、ここでの問題は何ですか?
更新 VincentsとTonysの回答は異なっていましたが、どちらも役に立ちました。Tonysを受け入れましたが、Vincentsの回答も必ず読んでください。