データベースの列を別の列の集計で自動的に更新したいのですが。関連するテーブルは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の回答も必ず読んでください。