Как я могу обновить представление со столбцами, которые получены из оператора 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 является производным столбцом, поэтому обновление не имеет смысла (поскольку пути к таблице нет).

Другие вопросы по тегам