Previous |
Next |
A view presents the output of a query as a table. If you want to change a view as you would change a table, you must create INSTEAD
OF
triggers. Instead of changing the view, they change the underlying tables.
For example, consider the view EMP_LOCATIONS
, whose NAME
column is created from the LAST_NAME
and FIRST_NAME
columns of the EMPLOYEES
table:
CREATE VIEW EMP_LOCATIONS AS SELECT e.EMPLOYEE_ID, e.LAST_NAME || ', ' || e.FIRST_NAME NAME, d.DEPARTMENT_NAME DEPARTMENT, l.CITY CITY, c.COUNTRY_NAME COUNTRY FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND d.LOCATION_ID = l.LOCATION_ID AND l.COUNTRY_ID = c.COUNTRY_ID ORDER BY LAST_NAME;
To update EMP_LOCATIONS
.NAME
, you must update EMPLOYEES
.LAST_NAME
and EMPLOYEES
.FIRST_NAME
. This is what the INSTEAD
OF
trigger in the following example does.
This trigger is part of the sample application that the tutorials and examples in this document show how to develop and deploy.
NEW
and OLD
are pseudorecords that the PL/SQL run-time engine creates and populates whenever a row-level trigger fires. OLD
and NEW
store the original and new values, respectively, of the record being processed by the trigger. They are called pseudorecords because they do not have all properties of PL/SQL records.
Creating an INSTEAD OF Trigger
CREATE OR REPLACE TRIGGER update_name_view_trigger INSTEAD OF UPDATE ON emp_locations BEGIN UPDATE employees SET first_name = substr( :NEW.name, instr( :new.name, ',' )+2), last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1) WHERE employee_id = :OLD.employee_id; END;