Основной массе людей, изучающих SQL, трудно понять, почему это представление нельзя обновить. Предположим, мы решили, что в случае увеличения фонда заработной платы отдела деньги должны распределяться среди служащих поровну. Мы создаем триггер INSTEAD OF:
CREATE OR REPLACE TRIGGER deptsal_update
INSTEAD OF UPDATE ON deptsal DECLARE
emps NUMBER;
diff NUMBER;
dno  NUMBER; BEGIN
IF :new.dname != :old.dname
THEN
UPDATE dept SET dname = :new.dname WHERE dname = :old.dname;
END IF;
IF :new.totsal != :old.totsal
THEN BEGIN
-- прочитать номер отдела
-- ошибка, если два отдела имеют одинаковые наименования SELECT depto INTO dno
FROM dept WHERE dname = :new.dname;
-• - прочитать число служащих в отделе
- - вызовет деление на нуль, если отдела не существует SELECT COUNT(*) INTO emps
FROM emp WHERE deptno = dno;
-- применить изменение еарплаты
diff := (:new.totsal - :old.totsal) /emps; UPDATE emp
SET sal = sal + diff WHERE deptno = dno; END; END IF; END;
Используя стандартные таблицы dept и emp (и, как обычно, 4 отдела и 14 служащих), а также описанные выше представление и триггер, мы можем написать бессмысленный, на первый взгляд, оператор:
UPDATE totsal
SET dname = INITCAP(dname)
, sal_amount = sal_amount + 6 WHARE dname = 'SALES';
который прибавит 1 к зарплате каждого продавца, а также изменит название отдела 30 с "SALES" на "Sales". Попытка выполнить операцию INSERT или DELETE в этом представлении приведет к ошибке с сообщением о том, что данное представление обновить нельзя, как в ранних версиях Oracle. Конечно, мы могли бы использовать триггеры INSERT и DELETE,
32	Oracle 8