`
feidi
  • 浏览: 120365 次
社区版块
存档分类
最新评论

[转贴]Oracle trigger实践

    博客分类:
  • db
阅读更多
一篇关于oracle trigger的实践代码
sql 代码
  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. --实例2------------------------
  48. --创建触发器,它将映射emp表中每个部门的总人数和总工资
  49. --创建映射表
  50. CREATE TABLE dept_sal
  51. AS
  52. SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;
  53. DESC dept_sal;
  54. --创建触发器
  55. CREATE OR REPLACE TRIGGER emp_info
  56. AFTER INSERT OR UPDATE OR DELETE ON emp
  57. DECLARE
  58. CURSOR cur_emp IS
  59. SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;
  60. BEGIN
  61. DELETE dept_sal; --触发时首先删除映射表信息
  62. FOR v_emp IN cur_emp LOOP
  63. --DBMS_OUTPUT.PUT_LINE(v_emp.deptno || v_emp.total_emp || v_emp.total_sal);
  64. --插入数据
  65. INSERT INTO dept_sal
  66. VALUES(v_emp.deptno,v_emp.total_emp,v_emp.total_sal);
  67. END LOOP;
  68. END;
  69. /
  70. --对emp表进行DML操作
  71. INSERT INTO emp(empno,deptno,sal) VALUES('123','10',10000);
  72. SELECT * FROM dept_sal;
  73. DELETE EMP WHERE empno=123;
  74. SELECT * FROM dept_sal;
  75. --实例3------------------------
  76. --创建触发器,它记录表的删除数据
  77. --创建表
  78. CREATE TABLE employee
  79. (
  80. id VARCHAR2(4) NOT NULL,
  81. name VARCHAR2(15) NOT NULL,
  82. age NUMBER(2) NOT NULL,
  83. sex CHAR NOT NULL
  84. );
  85. DESC employee;
  86. --插入数据
  87. INSERT INTO employee VALUES('e101','zhao',23,'M');
  88. INSERT INTO employee VALUES('e102','jian',21,'F');
  89. --创建记录表
  90. CREATE TABLE old_employee AS
  91. SELECT * FROM employee;
  92. DESC old_employee;
  93. --创建触发器
  94. CREATE OR REPLACE TRIGGER tig_old_emp
  95. AFTER DELETE ON employee --
  96. FOR EACH ROW --语句级触发,即每一行触发一次
  97. BEGIN
  98. INSERT INTO old_employee
  99. VALUES(:old.id,:old.name,:old.age,:old.sex); --:old代表旧值
  100. END;
  101. /
  102. --下面进行测试
  103. DELETE employee;
  104. SELECT * FROM old_employee;
  105. --实例4------------------------
  106. --创建触发器,利用视图插入数据
  107. --创建表
  108. CREATE TABLE tab1 (tid NUMBER(4) PRIMARY KEY,tname VARCHAR2(20),tage NUMBER(2));
  109. CREATE TABLE tab2 (tid NUMBER(4),ttel VARCHAR2(15),tadr VARCHAR2(30));
  110. --插入数据
  111. INSERT INTO tab1 VALUES(101,'zhao',22);
  112. INSERT INTO tab1 VALUES(102,'yang',20);
  113. INSERT INTO tab2 VALUES(101,'13761512841','AnHuiSuZhou');
  114. INSERT INTO tab2 VALUES(102,'13563258514','AnHuiSuZhou');
  115. --创建视图连接两张表
  116. CREATE VIEW tab_view AS
  117. SELECT tab1.tid,tname,ttel,tadr FROM tab1,tab2
  118. WHERE tab1.tid = tab2.tid;
  119. --创建触发器
  120. CREATE OR REPLACE TRIGGER tab_trigger
  121. INSTEAD OF INSERT ON tab_view
  122. BEGIN
  123. INSERT INTO tab1(tid,tname) VALUES(:new.tid,:new.tname);
  124. INSERT INTO tab2(ttel,tadr) VALUES(:new.ttel,:new.tadr);
  125. END;
  126. /
  127. --现在就可以利用视图插入数据
  128. INSERT INTO tab_view VALUES(105,'zhaoyang','13886681288','beijing');
  129. --查看效果
  130. SELECT * FROM tab_view;
  131. --实例5------------------------
  132. --创建触发器,比较emp表中更新的工资
  133. CREATE OR REPLACE TRIGGER sal_emp
  134. BEFORE UPDATE ON emp
  135. FOR EACH ROW
  136. BEGIN
  137. IF :OLD.sal > :NEW.sal THEN
  138. DBMS_OUTPUT.PUT_LINE('工资减少');
  139. ELSIF :OLD.sal < :NEW.sal THEN
  140. DBMS_OUTPUT.PUT_LINE('工资增加');
  141. ELSE
  142. DBMS_OUTPUT.PUT_LINE('工资未作任何变动');
  143. END IF;
  144. DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.sal);
  145. DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.sal);
  146. END;
  147. /
  148. --执行UPDATE查看效果
  149. UPDATE emp SET sal = 3000 WHERE empno = '7788';
  150. --实例6------------------------
  151. --创建触发器,将操作CREATE、DROP存储在log_info表
  152. --创建表
  153. CREATE TABLE log_info
  154. (
  155. manager_user VARCHAR2(15),
  156. manager_date VARCHAR2(15),
  157. manager_type VARCHAR2(15),
  158. obj_name VARCHAR2(15),
  159. obj_type VARCHAR2(15)
  160. );
  161. --创建触发器
  162. CREATE OR REPLACE TRIGGER trig_log_info
  163. AFTER CREATE OR DROP ON SCHEMA
  164. BEGIN
  165. INSERT INTO log_info
  166. VALUES(USER,SYSDATE,SYS.DICTIONARY_OBJ_NAME,SYS.DICTIONARY_OBJ_OWNER,
  167. SYS.DICTIONARY_OBJ_TYPE);
  168. END;
  169. /
  170. --测试语句
  171. CREATE TABLE a(id NUMBER);
  172. CREATE TYPE aa AS OBJECT(id NUMBER);
  173. /
  174. DROP TABLE a;
  175. DROP TYPE aa;
  176. --查看效果
  177. SELECT * FROM log_info;
  178. --相关数据字典-----------------------------------------------------//
  179. SELECT * FROM USER_TRIGGERS;
  180. SELECT * FROM ALL_TRIGGERS;
  181. SELECT * FROM DBA_TRIGGERS; --必须以DBA身份登陆才能使用此数据字典
  182. --启用和禁用
  183. ALTER TRIGGER trigger_name DISABLE;
  184. ALTER TRIGGER trigger_name ENABLE;
  185. ------------------------------------------------------------------------------------------End//
分享到:
评论
1 楼 楚若之夜 2010-10-09  
好东西,顶起

相关推荐

    易语言源码动网转贴.rar

    易语言是一种基于中文编程的计算机...总的来说,易语言源码动网转贴不仅涵盖了网络编程、数据处理、用户交互等基础知识,还涉及到安全、性能优化等多个领域,对于学习和理解易语言及网络应用开发有着重要的实践价值。

    动网转贴.zip易语言项目例子源码下载

    这个名为“动网转贴”的项目,是易语言编程实践中一个典型的例子,它为学习者提供了宝贵的实践素材,无论你是个人学习、学生毕业设计还是小团队的项目开发,都能从中获取灵感和参考。 首先,我们要理解易语言的核心...

    易语言动网转贴.rar

    易语言是中国本土开发的一种编程语言,它以汉字作为程序代码的基本元素,降低了...对于初学者,可以通过学习这个项目了解易语言的编程实践;对于有经验的开发者,它可以作为一个研究网络数据迁移和论坛系统集成的案例。

    BFC UBB转贴器

    由于现在流行的转贴工具都是基于浏览器的,转换速度比较慢,还得打开浏览器才能使用(同时受到浏览器版本限制)。 &lt;br&gt; 而这个小程序则完全不依赖于浏览器,以BFC采集器的UBB转换模块为基础,转换速度超快,...

    动网转贴.e.rar

    【标题】"动网转贴.e.rar"是一个压缩文件,很可能包含了有关动网论坛或社区的相关资源、数据或用户帖子的备份。动网是中国早期知名的网络论坛软件之一,提供了丰富的社区功能,允许用户发帖、回帖、互动等。这个...

    动易系统的论坛转贴工具

    《动易系统的论坛转贴工具详解与应用》 在互联网信息交流日益频繁的今天,论坛作为用户互动的重要平台,其内容分享与传播的作用不容忽视。动易系统的论坛转贴工具,便是为了解决用户在论坛间便捷分享内容而设计的一...

    oracle冷备份.txt

    收集了各位大神的冷备份步骤, 转贴,经过测试,按照这个描述的步骤执行,成功备份,中间没有任何问题

    电子政务-导电泡棉转贴装置.zip

    在“导电泡棉转贴装置”这个特定的场景下,我们可能是在讨论一种用于电子政务设备或系统中的特殊组件。 导电泡棉是一种具有导电性能的泡沫材料,通常用于电子设备的屏蔽、接地或防静电保护。在电子政务设备中,这种...

    Html处理软件、转贴工具(源代码)

    去除Html中的干扰码等(样例中以轻之国度的干扰码为例) 配置文件语法: 方法类型(整数) 最大匹配长度(整数) 字符串1(删除开头) 字符串2(删除结尾) 方法类型: 1:删除单行 2:删除行与行之间的

    东度极品论坛转贴工具

    东度极品论坛转贴工具东度极品论坛转贴工具

    行业文档-设计装置-木器、玻璃用贴花纸生产及转贴方法.zip

    这份文档可能包含了从贴花纸的设计、生产到实际转贴过程中的各种技术细节和实践经验。 1. 贴花纸设计:设计是贴花纸生产的第一步,通常涉及到图案创意、色彩搭配以及尺寸规划。设计人员需要考虑木器或玻璃制品的...

    论坛转贴 v1.0 JS版-源码.zip

    【标题】"论坛转贴 v1.0 JS版-源码.zip" 提供的是一个基于JavaScript的论坛转贴功能的源代码实现。JS版通常指的是使用JavaScript编程语言编写的版本,这表明该软件可能主要用于网页端,利用浏览器的JavaScript引擎...

    jquery的转贴功能实现

    在本主题中,我们将深入探讨如何利用jQuery实现“转贴”功能,这是一种常见的社交媒体分享功能,允许用户将网页内容轻松分享到各种社交网络。 首先,让我们了解一下jQuery的核心概念。jQuery通过一种简洁的语法提供...

    行业分类-设备装置-FPC吸附胶纸转贴组件.zip

    本压缩包文件"行业分类-设备装置-FPC吸附胶纸转贴组件.zip"主要关注的是FPC在实际应用中的一个重要环节——FPC吸附胶纸转贴组件。这个组件在FPC的制造和组装过程中起到关键作用,确保FPC能够稳定地固定在设备上,并...

    胖子说RUP(转贴)

    **标题:“胖子说RUP(转贴)”,源自博客文章:https://lkfnn.iteye.com/blog/33902** 这篇文章是关于Rational Unified Process(RUP)的讨论,由“胖子”(可能是作者的昵称)分享的一个转帖。RUP是一种广泛使用的...

    动易系统的论坛转贴工具 -ASP源码.zip

    对于想要深入学习ASP或论坛开发的读者来说,这个源码提供了一个实践和学习的机会。通过分析源码,不仅可以理解论坛转贴工具的工作原理,还可以提升自己在ASP编程、数据库管理和Web安全等方面的能力。

    论坛专用屏蔽干扰码转贴工具

    标题中的“论坛专用屏蔽干扰码转贴工具”指的是一个专为论坛设计的软件,它的主要功能是处理并转换论坛上常见的干扰码,以便用户能够顺利地复制和粘贴信息。在论坛交流中,有时为了防止恶意爬虫或者保护内容不被搜索...

    转贴一个网络设计的例子

    转贴一个网络设计的例子

    电子功用-导电胶配对模切对半转贴加工方法

    本篇将详细探讨“电子功用-导电胶配对模切对半转贴加工方法”,这是一种高效的生产工艺,旨在提高电子产品的性能和可靠性。 导电胶主要由导电填料(如金属颗粒)、树脂基体和添加剂组成。它的特性在于既能保持良好...

Global site tag (gtag.js) - Google Analytics