Как я могу обновить представление со столбцами, которые получены из оператора case?
Я создал вид, используя это (пренебрег другими столбцами):
create view view_table (is_root) as select
case when C1 = 'Yes' then 1
when C1 = 'No' then 0
else 0
end as is_root
from remote_db_table
Но когда я попытался обновить вид с помощью:
update view_table set is_root=1
Это не работает. Есть ли способ сделать это? Представление в Oracle, но удаленная таблица в mySQL
2 ответа
Вы можете сделать это в Oracle, создав триггер INSTEAD OF в представлении.
create or replace trigger vt_instead
instead of update on view_table
begin
if :new.is_root != :old.is_root
then
update remote_db_table
set C1 = case when :new.is_root = 1 then 'Yes'
else 'No' end
where id = :new.id;
end if;
end;
/
Это позволит вам выполнить ОБНОВЛЕНИЕ для представления, которое распространит изменения в базовое представление:
update view_table
set is_root = 0
where id = 23
/
Я не проверял это в отношении удаленной таблицы в базе данных MySQL (не имея такой настройки), но если вы можете обновить таблицу удаленно в SQL*Plus, то триггер также должен работать.
"Я хочу обновить все 40 столбцов, но только один столбец не обновляется, как описано выше"
Боюсь, вы все еще не совсем ясно даете понять, но я думаю, что вы спрашиваете, как обращаться со столбцами, которые не требуют перевода.
Триггер INSTEAD OF запускается вместо запускающего оператора DML (подсказка в названии). Это означает, что вам нужно обрабатывать все столбцы, которые вы хотите обновить через представление. В вашем сценарии это будет все сорок столбцов. Пересмотренный код триггера может выглядеть так:
create or replace trigger vt_instead
instead of update on view_table
begin
update remote_db_table
set C1 = case when :new.is_root = 1 then 'Yes'
else 'No' end
, C2 = :new.col2
, C3 = :new.col3
, C4 = :new.col4
....
, C40 = :new.col40
where id = :new.id;
end;
/
Любой столбец, не включенный в оператор обновления таблицы, не может быть обновлен через представление.
Я считаю, что вы пытаетесь невозможно. Хотя MySQL позволяет выполнять операторы обновления для представлений, is_root является производным столбцом, поэтому обновление не имеет смысла (поскольку пути к таблице нет).