触发器三(行级DML触发器)(学习笔记)
生活随笔
收集整理的這篇文章主要介紹了
触发器三(行级DML触发器)(学习笔记)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
行級DML觸發器
每當一條記錄出現更新操作時進行觸發操作定義時要定義FOR EACH ROW
使用":old.字段"和":new.字段"標識符
| No. | 觸發語句 | :old字段 | :new字段 |
| 1 | INSERT | 未定義,字段內容為NULL | INSERT操作結束后,為增加數據值 |
| 2 | UPDATE | 更新數據前的原始值 | UPDATE操作之后,更新數據后的新值 |
| 3 | DELETE | 刪除前的原始值 | 未定義,字段內容均為NULL |
":old.字段"和":new.字段只對行級觸發有效,如果觸發器沒有定義FOR EACH RO則無效而報語法錯誤
示例一、增加員工信息時,其職位必須在已經職位內選擇,并且工資不能超過5000,入職日期為當前日期
?
--創建觸發器 create or replace trigger myempinsertbefore insert on myemp for each ROWdeclarev_date DATE;v_jobcount NUMBER; BEGINSELECT COUNT(empno) INTO v_jobcount FROM myemp WHERE:new.job IN(SELECT DISTINCT job FROM myemp);IF v_jobcount=0 THEN --沒有找到此職位raise_application_error(-20009,'職位錯誤');ELSEIF :new.Sal>5000 THENraise_application_error(-20003,'工資不能超過5000');END IF;END IF;:new.Hiredate:=SYSDATE; end myempinsert; --調用執行 DECLARE BEGIN--添加錯誤信息 INSERT INTO myemp(empno,ename,job,mgr,sal,deptno)VALUES(9999,'Bdqn','MNAGER',7788,8000,10); EXCEPTIONWHEN OTHERS THENdbms_output.put_line(SQLERRM); END;?
示例二、myemp工資漲幅不能超過10%
--創建觸發器 CREATE OR REPLACE TRIGGER MYEMPADDSAL_TRIGGERBEFORE UPDATE ON MYEMPFOR EACH ROW DECLAREBEGINIF ABS((:NEW.SAL - :OLD.SAL) / :OLD.SAL) > 0.1 THENraise_application_error(-20005,'工資最大漲幅不能超過10%');END IF;END MYEMPADDSAL_TRIGGER;--調用 DECLARE BEGIN--添加錯誤信息 --INSERT INTO myemp(empno,ename,job,mgr,sal,deptno)VALUES(9999,'Bdqn','MNAGER',7788,8000,10); UPDATE myemp SET sal=3000 WHERE empno=7369; EXCEPTIONWHEN OTHERS THENdbms_output.put_line(SQLERRM); END; ?示例三、使用序列
?
--創建表 CREATE TABLE mt(ID NUMBER,NAME VARCHAR2(30),address varchar2(50),CONSTRAINT pd_mtid PRIMARY KEY(ID) ); SELECT * FROM mt; --創建序列 CREATE SEQUENCE mt_se; --創建觸發器 create or replace trigger mt_triggerbefore insert on mt for each row declare-- local variables here beginSELECT mt_se.NEXTVAL INTO :new.id FROM dual; end mt_trigger; --插入數據 INSERT INTO mt(name,address)VALUES('張三','深圳'); INSERT INTO mt(name,address)VALUES('李四','深圳'); SELECT * FROM mt; --發現ID自動增加12c自動序列
?
oracle12C中可以用以下寫法:更直觀
--創建表 CREATE TABLE mt(ID NUMBER,NAME VARCHAR2(30),address varchar2(50),CONSTRAINT pd_mtid PRIMARY KEY(ID) ); CREATE TABLE mtme AS SELECT * FROM mt WHERE 1=2; SELECT * FROM mt; SELECT * FROM mtme; --創建序列 CREATE SEQUENCE mt_se; --創建觸發器 create or replace trigger mtmebefore insert on mtme for each row declareBEGINDELETE mtme;INSERT INTO mt(id,name,address)VALUES(mt_se.nextval,:NEW.NAME,:NEW.ADDRESS); end mtme;--插入數據 INSERT INTO mt(name,address)VALUES('張三','深圳'); INSERT INTO mt(name,address)VALUES('李四','深圳');?
轉載于:https://www.cnblogs.com/liunanjava/p/4217523.html
總結
以上是生活随笔為你收集整理的触发器三(行级DML触发器)(学习笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UtIL DBUtil
- 下一篇: MD5加密详解