Oracle PL/SQL/Trigger/Trigger on View

Материал из SQL эксперт
Перейти к: навигация, поиск

Create trigger on a view

   <source lang="sql">

SQL> SQL> CREATE TABLE employee(

 2           emp_id           INTEGER,
 3           emp_name         VARCHAR2(32),
 4           supervised_by    INTEGER,
 5           pay_rate         NUMBER(9,2),
 6           pay_type         CHAR);

Table created. SQL> CREATE TABLE department

 2         (dept_id           INTEGER,
 3          dept_name         VARCHAR2(32));

Table created. SQL> SQL> CREATE OR REPLACE VIEW emp_public_data AS

 2      SELECT e.emp_id,
 3             e.emp_name,
 4             d.dept_name
 5      FROM employee e,
 6           department d;

View created. SQL> CREATE OR REPLACE TRIGGER emp_name_change

 2  INSTEAD OF UPDATE ON emp_public_data
 3  BEGIN
 4      IF (:new.emp_name <> :old.emp_name)
 5      OR (:old.emp_name IS NULL AND :new.emp_name IS NOT NULL) THEN
 6          UPDATE employee
 7          SET emp_name = :new.emp_name
 8          WHERE emp_id = :new.emp_id;
 9      END IF;
10  END;
11  /

Trigger created. SQL> SQL> drop table employee; Table dropped. SQL> drop table department; Table dropped. SQL> SQL>

</source>
   
  


Use an instead-of trigger.

   <source lang="sql">

SQL> CREATE TABLE place (

 2    room_id          NUMBER(5) PRIMARY KEY,
 3    building         VARCHAR2(15),
 4    room_number      NUMBER(4),
 5    number_seats     NUMBER(4),
 6    description      VARCHAR2(50)
 7    );

Table created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20001, "Building 7", 201, 1000, "Large Lecture Hall");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20002, "Building 6", 101, 500, "Small Lecture Hall");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20003, "Building 6", 150, 50, "Discussion Room A");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20004, "Building 6", 160, 50, "Discussion Room B");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats,description)

 2             VALUES (20005, "Building 6", 170, 50, "Discussion Room C");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20006, "Music Building", 100, 10, "Music Practice Room");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20007, "Music Building", 200, 1000, "Concert Room");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats, description)

 2             VALUES (20008, "Building 7", 300, 75, "Discussion Room D");

1 row created. SQL> SQL> INSERT INTO place (room_id, building, room_number, number_seats,description)

 2             VALUES (20009, "Building 7", 310, 50, "Discussion Room E");

1 row created. SQL> SQL> CREATE TABLE session (

 2    department       CHAR(3),
 3    course           NUMBER(3),
 4    description      VARCHAR2(2000),
 5    max_lecturer     NUMBER(3),
 6    current_lecturer NUMBER(3),
 7    num_credits      NUMBER(1),
 8    room_id          NUMBER(5)
 9    );

Table created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 101, "History 101", 30, 11, 4, 20000);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 301, "History 301", 30, 0, 4, 20004);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 101, "Computer Science 101", 50, 0, 4, 20001);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 203, "Economics 203", 15, 0, 3, 20002);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 102, "Computer Science 102", 35, 3, 4, 20003);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 410, "Music 410", 5, 4, 3, 20005);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 101, "Economics 101", 50, 0, 4, 20007);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("NUT", 307, "Nutrition 307", 20, 2, 4, 20008);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 100, "Music 100", 100, 0, 3, NULL);

1 row created. SQL> SQL> SQL> CREATE OR REPLACE VIEW session_place AS

 2    SELECT department, course, building, room_number
 3    FROM place, session
 4    WHERE place.room_id = session.room_id;

View created. SQL> SQL> SELECT * FROM session_place; DEP COURSE BUILDING ROOM_NUMBER --- ---------- --------------- ----------- HIS 301 Building 6 160 CS 101 Building 7 201 ECN 203 Building 6 101 CS 102 Building 6 150 MUS 410 Building 6 170 ECN 101 Music Building 200 NUT 307 Building 7 300 7 rows selected. SQL> SQL> CREATE TRIGGER sessionRoomsInsert

 2    INSTEAD OF INSERT ON session_place
 3  DECLARE
 4    v_roomID place.room_id%TYPE;
 5  BEGIN
 6    SELECT room_id
 7      INTO v_roomID
 8      FROM place
 9      WHERE building = :new.building
10      AND room_number = :new.room_number;
11
12    UPDATE session
13      SET room_id = v_roomID
14      WHERE department = :new.department
15      AND course = :new.course;
16  END sessionRoomsInsert;
17  /

Trigger created. SQL> SQL> INSERT INTO session_place (department, course, building, room_number)

 2    VALUES ("MUS", 100, "Music Building", 200);

1 row created. SQL> SQL> SELECT * FROM session_place; DEP COURSE BUILDING ROOM_NUMBER --- ---------- --------------- ----------- HIS 301 Building 6 160 CS 101 Building 7 201 ECN 203 Building 6 101 CS 102 Building 6 150 MUS 410 Building 6 170 ECN 101 Music Building 200 NUT 307 Building 7 300 MUS 100 Music Building 200 8 rows selected. SQL> SQL> drop view session_place; View dropped. SQL> drop table session; Table dropped. SQL> drop table place; Table dropped. SQL>

</source>