Oracle Instead of Trigger的用法

jinqibingl發表於2012-10-04

Oracle Instead of Trigger的用法  

Oracle Instead of Trigger的用法

1. instead of trigger 是基於檢視建立的,不能建在表上,為什麼要建在檢視上,一般的檢視如果其資料來源一個表並且包含該表的主鍵,就可以對檢視進行DML操作.另外一種情況是從多個表查詢出來的.這樣我們就不能對檢視進行操作了,也就是隻能查詢.instead of trigger可以解決建在多表上檢視的更新操作.
2.下面我們就來例項操作:
a.先建表,簡單點就三個分別是學生表,課程表,學生選課表
CREATE TABLE STUDENT
(
   CODE  VARCHAR2(5),
   LNAME VARCHAR2(200)
)
CREATE TABLE COURSE
(
    CODE  VARCHAR2(5),
    CNAME VARCHAR2(30)
)
CREATE TABLE ST_CR
(
   STUDENT VARCHAR2(5),
   COURSE  VARCHAR2(5),
   GRADE   NUMBER
)
--表的約束
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT$PK PRIMARY KEY(CODE);
ALTER TABLE COURSE ADD CONSTRAINT COURSE$PK PRIMARY KEY(CODE);
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$PK PRIMARY KEY(STUDENT, COURSE);
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$STUDENT FOREIGN KEY(STUDENT) REFERENCES STUDENT(CODE);
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$COURSE FOREIGN KEY(COURSE) REFERENCES COURSE(CODE);
b.基於這三個表的檢視
CREATE OR REPLACE VIEW STUDENT_STATUS AS
   SELECT S.CODE S_CODE, S.LNAME STUDENT, C.CODE C_CODE, C.CNAME COURSE, SC.GRADE GRADE
      FROM STUDENT S, COURSE C, ST_CR SC
        WHERE S.CODE = SC.STUDENT
          AND C.CODE = SC.COURSE
c.基於檢視的觸發器
CREATE OR REPLACE TRIGGER TRI_STCR INSTEAD OF INSERT ON STUDENT_STATUS
   FOR EACH ROW
DECLARE
  W_ACTION VARCHAR2(1);
BEGIN
  IF    INSERTING THEN
    W_ACTION := 'I';
  ELSE
    RAISE PROGRAM_ERROR;
  END IF;
    INSERT INTO STUDENT(CODE, LNAME) VALUES(:NEW.S_CODE,:NEW.STUDENT);
    INSERT INTO COURSE(CODE, CNAME) VALUES(:NEW.C_CODE, :NEW.COURSE);
    INSERT INTO ST_CR(STUDENT, COURSE, GRADE)
       VALUES(:NEW.S_CODE, :NEW.C_CODE, :NEW.GRADE);
END;
d.對檢視執行資料插入
INSERT INTO STUDENT_STATUS(S_CODE, STUDENT, C_CODE, COURSE, GRADE)
       VALUES('001','Mike','EN','English',86);

可以看到每個表各有一條資料已經插入.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9606200/viewspace-745691/,如需轉載,請註明出處,否則將追究法律責任。

相關文章