--復合觸發器創建語法 CREATE [OR REPLACE] TRIGGER 觸發器名稱 FOR [INSERT | UPDATE | UPDATE OF 列名稱 [,列名稱,...] | DELETE] ON 表名稱 COMPOUND TRIGGER [ BEFORE STATEMENT IS -- 語句執行前觸發(表級) [ 聲明部分 ; ] BEGIN 程序主體部分 ; END BEFORE STATEMENT ; ] [ BEFORE EACH ROW IS -- 語句執行前觸發(行級) [ 聲明部分 ; ] BEGIN 程序主體部分 ; END BEFORE EACH ROW ; ] [ AFTER STATEMENT IS -- 語句執行後觸發(表級) [ 聲明部分 ; ] BEGIN 程序主體部分 ; END AFTER STATEMENT ; ] [ AFTER EACH ROW IS -- 語句執行後觸發(行級) [ 聲明部分 ; ] BEGIN 程序主體部分 ; END AFTER EACH ROW ; ] END ; /
示例一、創建復合觸發器
--創建復合觸發器 create or replace trigger compound_trigger FOR INSERT OR UPDATE OR DELETE on dept compound TRIGGER BEFORE STATEMENT IS -- 語句執行前觸發(表級) BEGIN DBMS_OUTPUT.put_line('1、BEFORE STATEMENT .') ; END BEFORE STATEMENT; BEFORE EACH ROW IS -- 語句執行前觸發(行級) BEGIN DBMS_OUTPUT.put_line('2、BEFORE EACH ROW .') ; END BEFORE EACH ROW; AFTER STATEMENT IS -- 語句執行後觸發(表級) BEGIN DBMS_OUTPUT.put_line('3、AFTER STATEMENT .') ; END AFTER STATEMENT; AFTER EACH ROW IS -- 語句執行後觸發(行級) BEGIN DBMS_OUTPUT.put_line('4、AFTER EACH ROW .') ; END AFTER EACH ROW; end compound_trigger;
--測試 INSERT INTO dept(deptno,Dname,loc) VALUES(97,'RD','深圳'); SELECT * FROM dept; --結果 1、BEFORE STATEMENT . 2、BEFORE EACH ROW . 4、AFTER EACH ROW . 3、AFTER STATEMENT .
示例二、
定義觸發器,此觸發器可以完成如下的功能 在周末時間不允許更新emp表數據; 在更新數據時,要求將所有增加的數據自動變為大寫; 在更新完成之後,新增雇員的工資不得高於公司的平均工資--創建復合觸發器 create or replace trigger emp_compound_trigger FOR INSERT OR UPDATE OR DELETE on emp compound TRIGGER BEFORE STATEMENT IS --表級,語句執行前觸發 v_curweek VARCHAR2(20); --聲明,--周末不能更新 BEGIN SELECT to_char(SYSDATE,'day') INTO v_curweek FROM dual; IF TRIM(v_curweek) IN ('星期六','星期日') THEN raise_application_error(-20004,'周末不允許更新員工表emp'); END IF; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLCODE||SQLERRM); END BEFORE STATEMENT; BEFORE EACH ROW IS --行級,語句執行前觸發 v_avgsal emp.sal%TYPE; --聲明平均工資變量 BEGIN IF inserting OR updating THEN :new.ename:=upper(:new.ename); :new.job:=upper(:new.job); END IF; IF inserting THEN SELECT AVG(sal) INTO v_avgsal FROM emp; IF :new.sal > v_avgsal THEN raise_application_error(-20005,'新員工工資不重高於公司平均工資!'); END IF; END IF; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLCODE||SQLERRM); END BEFORE EACH ROW; end emp_compound_trigger;
--測試 INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,deptno) VALUES(8888,'test','clerk',7369,SYSDATE,1000,10); --時間改為周末 INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,deptno) VALUES(9999,'test1','clerk',7369,SYSDATE,5000,20);