我想用另一列的聚合自動更新數據庫列。 有三個表涉及:自動更新數據庫中的字段
T_RIDER
RIDER_ID
TMP_PONYLIST
...
T_RIDER_PONY
RIDER_ID
PONY_ID
T_PONY
PONY_ID
PONY_NAME
...
T_RIDER
和T_PONY
具有N:經由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
。我發現了一些有關使用三個觸發器和包變量的提示,但這聽起來太複雜了。
也許你認爲我最好改變模式或完全擺脫TMP_PONYLIST
。 這些是選項,但不是這個問題的主題。 目前我只對不需要對我的應用程序進行任何更改的答案感興趣(沒有應用程序直接與表格一起工作,只有視圖,允許有視圖的詭計)。
那麼,我該如何自動保持TMP_PONYLIST
最新? 如何連接字符串是一個有趣的子問題,我還沒有找到一個優雅的解決方案。
我正在使用Oracle數據庫10g企業版版本10.2.0.4.0 - 64bi。
UPDATE
我喜歡用物化視圖的概念。 我所擁有的是:
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
禁止文檔聚合,所以這裏有什麼問題?
UPDATE Vincents和Tonys的答案是不同的,但都有幫助。 我接受Tonys,但一定要閱讀Vincents的答案。
我建議不要在單個列中存儲多個值(「Twisty Tail; Candy Cane; Lucky Leaf」)... – 2009-09-22 11:24:48