我想用另一列的聚合自动更新数据库列。涉及三个表:
T_RIDER
RIDER_ID
TMP_PONYLIST
...
T_RIDER_PONY
RIDER_ID
PONY_ID
T_PONY
PONY_ID
PONY_NAME
...
T_RIDER
并T_PONY
通过 建立n:m关系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。
更新
我喜欢使用物化视图的想法。我所拥有的是:
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
,那么这里有什么问题?
更新 文森特和托尼的答案不同,但都有帮助。我接受了托尼,但也请务必阅读文森特的回答。