Я хочу автоматически обновить столбец базы данных с помощью совокупности другого столбца.
Здесь задействованы три таблицы:
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 Database 10g Enterprise Edition Release 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
Ответы Винсента и Тониса были разные, но оба полезны.
Я принял Тониса, но обязательно прочитайте и ответ Винсента.