触发器三(行级DML触发器)(学习笔记)
生活随笔
收集整理的這篇文章主要介紹了
触发器三(行级DML触发器)(学习笔记)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
行級(jí)DML觸發(fā)器
每當(dāng)一條記錄出現(xiàn)更新操作時(shí)進(jìn)行觸發(fā)操作定義時(shí)要定義FOR EACH ROW
使用":old.字段"和":new.字段"標(biāo)識(shí)符
| No. | 觸發(fā)語(yǔ)句 | :old字段 | :new字段 |
| 1 | INSERT | 未定義,字段內(nèi)容為NULL | INSERT操作結(jié)束后,為增加數(shù)據(jù)值 |
| 2 | UPDATE | 更新數(shù)據(jù)前的原始值 | UPDATE操作之后,更新數(shù)據(jù)后的新值 |
| 3 | DELETE | 刪除前的原始值 | 未定義,字段內(nèi)容均為NULL |
":old.字段"和":new.字段只對(duì)行級(jí)觸發(fā)有效,如果觸發(fā)器沒(méi)有定義FOR EACH RO則無(wú)效而報(bào)語(yǔ)法錯(cuò)誤
示例一、增加員工信息時(shí),其職位必須在已經(jīng)職位內(nèi)選擇,并且工資不能超過(guò)5000,入職日期為當(dāng)前日期
?
--創(chuàng)建觸發(fā)器 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 --沒(méi)有找到此職位raise_application_error(-20009,'職位錯(cuò)誤');ELSEIF :new.Sal>5000 THENraise_application_error(-20003,'工資不能超過(guò)5000');END IF;END IF;:new.Hiredate:=SYSDATE; end myempinsert; --調(diào)用執(zhí)行 DECLARE BEGIN--添加錯(cuò)誤信息 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工資漲幅不能超過(guò)10%
--創(chuàng)建觸發(fā)器 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,'工資最大漲幅不能超過(guò)10%');END IF;END MYEMPADDSAL_TRIGGER;--調(diào)用 DECLARE BEGIN--添加錯(cuò)誤信息 --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; ?示例三、使用序列
?
--創(chuàng)建表 CREATE TABLE mt(ID NUMBER,NAME VARCHAR2(30),address varchar2(50),CONSTRAINT pd_mtid PRIMARY KEY(ID) ); SELECT * FROM mt; --創(chuàng)建序列 CREATE SEQUENCE mt_se; --創(chuàng)建觸發(fā)器 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; --插入數(shù)據(jù) INSERT INTO mt(name,address)VALUES('張三','深圳'); INSERT INTO mt(name,address)VALUES('李四','深圳'); SELECT * FROM mt; --發(fā)現(xiàn)ID自動(dòng)增加12c自動(dòng)序列
?
oracle12C中可以用以下寫(xiě)法:更直觀(guān)
--創(chuàng)建表 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; --創(chuàng)建序列 CREATE SEQUENCE mt_se; --創(chuàng)建觸發(fā)器 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;--插入數(shù)據(jù) INSERT INTO mt(name,address)VALUES('張三','深圳'); INSERT INTO mt(name,address)VALUES('李四','深圳');?
轉(zhuǎn)載于:https://www.cnblogs.com/liunanjava/p/4217523.html
總結(jié)
以上是生活随笔為你收集整理的触发器三(行级DML触发器)(学习笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UtIL DBUtil
- 下一篇: 关于c# .net爬虫