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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Test Oracle triggerOracle
- Oracle trigger問題Oracle
- 禁止oracle表的觸發器triggerOracle觸發器
- INSTEAD OF(zt)
- oracle comment on的用法Oracle
- ORACLE SEQUENCE用法Oracle
- 【Oracle的NVL函式用法】Oracle函式
- oracle樹中prior的用法Oracle
- oracle中的CURRVAL和NEXTVAL用法Oracle
- Mysql TriggerMySql
- oracle中substr() instr() 用法Oracle
- SqlServer 2005 TriggerSQLServer
- jenkins trigger by timeJenkins
- 【TUNE_ORACLE】Oracle Hint之概念與用法Oracle
- Oracle行列轉換及pivot子句的用法Oracle
- [轉載] Oracle:start with...connect by子句的用法Oracle
- Oracle臨時表的用法總結FLOracle
- Use KTPASS instead of adden to configure mssql.keytabSQL
- 非空校驗在oracle和mysql中的用法OracleMySql
- trigger+lob+ora-22275
- WPF TryFindResource typeof Setter Trigger
- antD——Warning: `callback` is deprecated. Please return a promise instead.Promise
- Oracle批量插入資料insert all into用法Oracle
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- oracle正規表示式regexp_like的用法詳解Oracle
- ORA-01031 CREATE TRIGGER ON DATABASEDatabase
- Oracle中Nextval用法SEQUENCE與SYS_GUID()OracleGUI
- Trigger引起的active dataguard 報error ORA-16191Error
- MySQL入門-- TRIGGER(觸發器)MySql觸發器
- [20221227]a mutating table error without a trigger!.txtError
- Oracle minus用法詳解及應用例項Oracle
- oracle中listagg()和wmsys.wm_concat()基本用法Oracle
- oracle資料庫常用分析函式與聚合函式的用法Oracle資料庫函式
- 強制設定和恢復依賴屬性值(類似WPF內建的Style.Trigger和Template.Trigger)
- MySQL 事件監聽 huangdijia/Laravel-triggerMySql事件Laravel
- 用 logoff trigger 保留每個 session 的效能資訊(轉)GoSession
- PostgreSQL DBA(174) - PG 13(Allow inserts to trigger autovacuum)SQL
- [MySQL光速入門]026 觸發器 trigger!!!MySql觸發器
- jquery中trigger無法觸發hover事件的解決方案jQuery事件