zoukankan      html  css  js  c++  java
  • 转:Oracle触发器小结

    1. --[6]// Oracle Trigger   
    2. ---------------------------------------------------------------------------------------------//   
    3. --实例1------------------------   
    4. --创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表   
    5. --创建测试表   
    6. CREATE TABLE test   
    7. (   
    8.     t_id   NUMBER(4),   
    9.     t_name VARCHAR2(20),   
    10.     t_age  NUMBER(2),   
    11.     t_sex  CHAR   
    12. );   
    13. --创建记录测试表   
    14. CREATE TABLE test_log   
    15. (   
    16.     l_user   VARCHAR2(15),   
    17.     l_type   VARCHAR2(15),   
    18.     l_date   VARCHAR2(30)   
    19. );   
    20. --创建触发器   
    21. CREATE OR REPLACE TRIGGER test_trigger   
    22. AFTER DELETE OR INSERT OR UPDATE ON test   
    23. DECLARE   
    24.     v_type test_log.l_type%TYPE;   
    25. BEGIN   
    26.     IF INSERTING THEN  --INSERT触发   
    27.         v_type := 'INSERT';   
    28.         DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志');   
    29.     ELSIF UPDATING THEN  --UPDATE触发   
    30.         v_type := 'UPDATE';   
    31.         DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志');   
    32.     ELSIF DELETING THEN   
    33.         v_type := 'DELETE';   
    34.         DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并已记录到日志');   
    35.     END IF;   
    36.     INSERT INTO test_log VALUES(user,v_type,   
    37.                     TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));   
    38. END;   
    39. /   
    40. --下面我们来分别执行DML语句   
    41. INSERT INTO test VALUES(101,'zhao',22,'M');   
    42. UPDATE test SET t_age = 30 WHERE t_id = 101;   
    43. DELETE test WHERE t_id = 101;   
    44. --然后查看效果   
    45. SELECT * FROM test;   
    46. SELECT * FROM test_log;   
    47.   
    48. --实例2------------------------   
    49. --创建触发器,它将映射emp表中每个部门的总人数和总工资   
    50. --创建映射表   
    51. CREATE TABLE dept_sal   
    52.     AS   
    53.     SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;   
    54. DESC dept_sal;   
    55. --创建触发器   
    56. CREATE OR REPLACE TRIGGER emp_info   
    57. AFTER INSERT OR UPDATE OR DELETE ON emp   
    58. DECLARE   
    59.     CURSOR cur_emp IS   
    60.       SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;   
    61. BEGIN   
    62.     DELETE dept_sal;  --触发时首先删除映射表信息   
    63.     FOR v_emp IN cur_emp LOOP   
    64.         --DBMS_OUTPUT.PUT_LINE(v_emp.deptno || v_emp.total_emp || v_emp.total_sal);   
    65.         --插入数据   
    66.         INSERT INTO dept_sal   
    67.             VALUES(v_emp.deptno,v_emp.total_emp,v_emp.total_sal);   
    68.     END LOOP;   
    69. END;   
    70. /   
    71. --emp表进行DML操作   
    72. INSERT INTO emp(empno,deptno,sal) VALUES('123','10',10000);   
    73. SELECT * FROM dept_sal;   
    74. DELETE EMP WHERE empno=123;   
    75. SELECT * FROM dept_sal;   
    76.   
    77. --实例3------------------------   
    78. --创建触发器,它记录表的删除数据   
    79. --创建表   
    80. CREATE TABLE employee   
    81. (   
    82.     id   VARCHAR2(4)  NOT NULL,   
    83.     name VARCHAR2(15) NOT NULL,   
    84.     age  NUMBER(2)    NOT NULL,   
    85.     sex  CHAR         NOT NULL   
    86. );   
    87. DESC employee;   
    88. --插入数据   
    89. INSERT INTO employee VALUES('e101','zhao',23,'M');   
    90. INSERT INTO employee VALUES('e102','jian',21,'F');   
    91. --创建记录表   
    92. CREATE TABLE old_employee AS   
    93.     SELECT * FROM employee;   
    94. DESC old_employee;   
    95. --创建触发器   
    96. CREATE OR REPLACE TRIGGER tig_old_emp   
    97. AFTER DELETE ON employee  --   
    98. FOR EACH ROW  --语句级触发,即每一行触发一次   
    99. BEGIN   
    100.     INSERT INTO old_employee   
    101.         VALUES(:old.id,:old.name,:old.age,:old.sex);  --:old代表旧值   
    102. END;   
    103. /   
    104. --下面进行测试   
    105. DELETE employee;   
    106. SELECT * FROM old_employee;   
    107.   
    108. --实例4------------------------   
    109. --创建触发器,利用视图插入数据   
    110. --创建表   
    111. CREATE TABLE tab1 (tid NUMBER(4) PRIMARY KEY,tname VARCHAR2(20),tage NUMBER(2));   
    112. CREATE TABLE tab2 (tid NUMBER(4),ttel VARCHAR2(15),tadr VARCHAR2(30));   
    113. --插入数据   
    114. INSERT INTO tab1 VALUES(101,'zhao',22);   
    115. INSERT INTO tab1 VALUES(102,'yang',20);   
    116. INSERT INTO tab2 VALUES(101,'13761512841','AnHuiSuZhou');   
    117. INSERT INTO tab2 VALUES(102,'13563258514','AnHuiSuZhou');   
    118. --创建视图连接两张表   
    119. CREATE VIEW tab_view AS   
    120.     SELECT tab1.tid,tname,ttel,tadr FROM tab1,tab2   
    121.         WHERE tab1.tid = tab2.tid;   
    122. --创建触发器   
    123. CREATE OR REPLACE TRIGGER tab_trigger   
    124. INSTEAD OF INSERT ON tab_view   
    125. BEGIN   
    126.     INSERT INTO tab1(tid,tname) VALUES(:new.tid,:new.tname);   
    127.     INSERT INTO tab2(ttel,tadr) VALUES(:new.ttel,:new.tadr);   
    128. END;   
    129. /   
    130. --现在就可以利用视图插入数据   
    131. INSERT INTO tab_view VALUES(105,'zhaoyang','13886681288','beijing');   
    132. --查看效果   
    133. SELECT * FROM tab_view;   
    134.   
    135. --实例5------------------------   
    136. --创建触发器,比较emp表中更新的工资   
    137. CREATE OR REPLACE TRIGGER sal_emp   
    138. BEFORE UPDATE ON emp   
    139. FOR EACH ROW   
    140. BEGIN   
    141.        
    142.     IF :OLD.sal > :NEW.sal THEN   
    143.         DBMS_OUTPUT.PUT_LINE('工资减少');   
    144.     ELSIF :OLD.sal < :NEW.sal THEN   
    145.         DBMS_OUTPUT.PUT_LINE('工资增加');   
    146.     ELSE   
    147.         DBMS_OUTPUT.PUT_LINE('工资未作任何变动');   
    148.     END IF;   
    149.     DBMS_OUTPUT.PUT_LINE('更新前工资 ' || :OLD.sal);   
    150.     DBMS_OUTPUT.PUT_LINE('更新后工资 ' || :NEW.sal);   
    151. END;   
    152. /   
    153. --执行UPDATE查看效果   
    154. UPDATE emp SET sal = 3000 WHERE empno = '7788';   
    155.   
    156. --实例6------------------------   
    157. --创建触发器,将操作CREATEDROP存储在log_info   
    158. --创建表   
    159. CREATE TABLE log_info   
    160. (   
    161.     manager_user VARCHAR2(15),   
    162.     manager_date VARCHAR2(15),   
    163.     manager_type VARCHAR2(15),   
    164.     obj_name     VARCHAR2(15),   
    165.     obj_type     VARCHAR2(15)   
    166. );   
    167. --创建触发器   
    168. CREATE OR REPLACE TRIGGER trig_log_info   
    169. AFTER CREATE OR DROP ON SCHEMA   
    170. BEGIN   
    171.     INSERT INTO log_info   
    172.         VALUES(USER,SYSDATE,SYS.DICTIONARY_OBJ_NAME,SYS.DICTIONARY_OBJ_OWNER,   
    173.             SYS.DICTIONARY_OBJ_TYPE);   
    174. END;   
    175. /   
    176. --测试语句   
    177. CREATE TABLE a(id NUMBER);   
    178. CREATE TYPE aa AS OBJECT(id NUMBER);   
    179. /   
    180. DROP TABLE a;   
    181. DROP TYPE aa;   
    182. --查看效果   
    183. SELECT * FROM log_info;   
    184.   
    185. --相关数据字典-----------------------------------------------------//   
    186. SELECT * FROM USER_TRIGGERS;   
    187. SELECT * FROM ALL_TRIGGERS;   
    188. SELECT * FROM DBA_TRIGGERS;  --必须以DBA身份登陆才能使用此数据字典   
    189.   
    190. --启用和禁用   
    191. ALTER TRIGGER trigger_name DISABLE;   
    192. ALTER TRIGGER trigger_name ENABLE;   
    193. ------------------------------------------------------------------------------------------End//  

     

    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    基于小脚丫DDS 调频 调幅 调相 切换波形 AD5601输出模拟波形
    spi 10方式编写
    VGA colorbar显示
    hostname
    让CentOS能用yum自动安装rar和unrar
    Centos系统使用代理上网时 yum的代理设置
    【转】uvm 与 system verilog的理解
    跟我一起学习VIM
    gVim 配置方案 采用Vundle管理插件
    在 Ubuntu 16.04 中安装谷歌 Chrome 浏览器
  • 原文地址:https://www.cnblogs.com/tracy/p/1712621.html
Copyright © 2011-2022 走看看