Oracle Tigger触发器 实例
生活随笔
收集整理的這篇文章主要介紹了
Oracle Tigger触发器 实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Oracle Tigger觸發器 實例
--實例1--------------------------創建觸發器,當用戶對test表執行DML語句時,將相關信息記錄到日志表
--創建測試表
CREATE TABLE test
(
?t_id?? NUMBER(4),
?t_name VARCHAR2(20),
?t_age? NUMBER(2),
?t_sex? CHAR
);
--創建記錄測試表
CREATE TABLE test_log
(
?l_user?? VARCHAR2(15),
?l_type?? VARCHAR2(15),
?l_date?? VARCHAR2(30)
);
--創建觸發器
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test
DECLARE
?v_type test_log.l_type%TYPE;
BEGIN
?IF INSERTING THEN? --INSERT觸發
??v_type := 'INSERT';
??DBMS_OUTPUT.PUT_LINE('記錄已經成功插入,并已記錄到日志');
?ELSIF UPDATING THEN? --UPDATE觸發
??v_type := 'UPDATE';
??DBMS_OUTPUT.PUT_LINE('記錄已經成功更新,并已記錄到日志');
?ELSIF DELETING THEN
??v_type := 'DELETE';
??DBMS_OUTPUT.PUT_LINE('記錄已經成功刪除,并已記錄到日志');
?END IF;
?INSERT INTO test_log VALUES(user,v_type,
??????? TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));
END;
/
--下面我們來分別執行DML語句
INSERT INTO test VALUES(101,'zhao',22,'M');
UPDATE test SET t_age = 30 WHERE t_id = 101;
DELETE test WHERE t_id = 101;
--然后查看效果
SELECT * FROM test;
SELECT * FROM test_log; --實例2------------------------ --創建觸發器,它將映射emp表中每個部門的總人數和總工資 --創建映射表 CREATE TABLE dept_salASSELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno; DESC dept_sal; --創建觸發器 CREATE OR REPLACE TRIGGER emp_info AFTER INSERT OR UPDATE OR DELETE ON emp DECLARECURSOR cur_emp ISSELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno; BEGINDELETE dept_sal;? --觸發時首先刪除映射表信息FOR v_emp IN cur_emp LOOP--DBMS_OUTPUT.PUT_LINE(v_emp.deptno || v_emp.total_emp || v_emp.total_sal);--插入數據INSERT INTO dept_salVALUES(v_emp.deptno,v_emp.total_emp,v_emp.total_sal);END LOOP; END; / --對emp表進行DML操作 INSERT INTO emp(empno,deptno,sal) VALUES('123','10',10000); SELECT * FROM dept_sal; DELETE EMP WHERE empno=123; SELECT * FROM dept_sal; --實例3------------------------ --創建觸發器,它記錄表的刪除數據 --創建表 CREATE TABLE employee (id?? VARCHAR2(4)? NOT NULL,name VARCHAR2(15) NOT NULL,age? NUMBER(2)??? NOT NULL,sex? CHAR???????? NOT NULL ); DESC employee; --插入數據 INSERT INTO employee VALUES('e101','zhao',23,'M'); INSERT INTO employee VALUES('e102','jian',21,'F'); --創建記錄表 CREATE TABLE old_employee ASSELECT * FROM employee; DESC old_employee; --創建觸發器 CREATE OR REPLACE TRIGGER tig_old_emp AFTER DELETE ON employee? -- FOR EACH ROW? --語句級觸發,即每一行觸發一次 BEGININSERT INTO old_employeeVALUES(:old.id,:old.name,:old.age,:old.sex);? --:old代表舊值 END; / --下面進行測試 DELETE employee; SELECT * FROM old_employee; --實例4------------------------ --創建觸發器,利用視圖插入數據 --創建表 CREATE TABLE tab1 (tid NUMBER(4) PRIMARY KEY,tname VARCHAR2(20),tage NUMBER(2)); CREATE TABLE tab2 (tid NUMBER(4),ttel VARCHAR2(15),tadr VARCHAR2(30)); --插入數據 INSERT INTO tab1 VALUES(101,'zhao',22); INSERT INTO tab1 VALUES(102,'yang',20); INSERT INTO tab2 VALUES(101,'13761512841','AnHuiSuZhou'); INSERT INTO tab2 VALUES(102,'13563258514','AnHuiSuZhou'); --創建視圖連接兩張表 CREATE VIEW tab_view ASSELECT tab1.tid,tname,ttel,tadr FROM tab1,tab2WHERE tab1.tid = tab2.tid; --創建觸發器 CREATE OR REPLACE TRIGGER tab_trigger INSTEAD OF INSERT ON tab_view BEGININSERT INTO tab1(tid,tname) VALUES(:new.tid,:new.tname);INSERT INTO tab2(ttel,tadr) VALUES(:new.ttel,:new.tadr); END; / --現在就可以利用視圖插入數據 INSERT INTO tab_view VALUES(105,'zhaoyang','13886681288','beijing'); --查看效果 SELECT * FROM tab_view; --實例5------------------------ --創建觸發器,比較emp表中更新的工資 CREATE OR REPLACE TRIGGER sal_emp BEFORE UPDATE ON emp FOR EACH ROW BEGINIF :OLD.sal > :NEW.sal THENDBMS_OUTPUT.PUT_LINE('工資減少');ELSIF :OLD.sal < :NEW.sal THENDBMS_OUTPUT.PUT_LINE('工資增加');ELSEDBMS_OUTPUT.PUT_LINE('工資未作任何變動');END IF;DBMS_OUTPUT.PUT_LINE('更新前工資 :' || :OLD.sal);DBMS_OUTPUT.PUT_LINE('更新后工資 :' || :NEW.sal); END; / --執行UPDATE查看效果 UPDATE emp SET sal = 3000 WHERE empno = '7788'; --實例6------------------------ --創建觸發器,將操作CREATE、DROP存儲在log_info表 --創建表 CREATE TABLE log_info (manager_user VARCHAR2(15),manager_date VARCHAR2(15),manager_type VARCHAR2(15),obj_name???? VARCHAR2(15),obj_type???? VARCHAR2(15) ); --創建觸發器 CREATE OR REPLACE TRIGGER trig_log_info AFTER CREATE OR DROP ON SCHEMA BEGININSERT INTO log_infoVALUES(USER,SYSDATE,SYS.DICTIONARY_OBJ_NAME,SYS.DICTIONARY_OBJ_OWNER,SYS.DICTIONARY_OBJ_TYPE); END; / --測試語句 CREATE TABLE a(id NUMBER); CREATE TYPE aa AS OBJECT(id NUMBER); / DROP TABLE a; DROP TYPE aa; --查看效果 SELECT * FROM log_info; --相關數據字典-----------------------------------------------------// SELECT * FROM USER_TRIGGERS; SELECT * FROM ALL_TRIGGERS; SELECT * FROM DBA_TRIGGERS;? --必須以DBA身份登陸才能使用此數據字典 --啟用和禁用 ALTER TRIGGER trigger_name DISABLE; ALTER TRIGGER trigger_name ENABLE;
總結
以上是生活随笔為你收集整理的Oracle Tigger触发器 实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度2018营收破千亿,AI成发展主要驱
- 下一篇: FreeRTOS消息队列