日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

触发器三(行级DML触发器)(学习笔记)

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 触发器三(行级DML触发器)(学习笔记) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

行級DML觸發器

每當一條記錄出現更新操作時進行觸發操作定義時要定義FOR EACH ROW

使用":old.字段"和":new.字段"標識符

No.觸發語句 :old字段:new字段
1INSERT 未定義,字段內容為NULLINSERT操作結束后,為增加數據值
2UPDATE更新數據前的原始值UPDATE操作之后,更新數據后的新值
3DELETE刪除前的原始值未定義,字段內容均為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触发器)(学习笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。