- 浏览: 119201 次
文章分类
最新评论
-
asheng0401:
楼主,你这相当于给那些会用的人看的
一个Java项目Ant实例 -
rmn190:
太好了, 刚从Linux转到Windows, 正需要一个关于c ...
收集到的cygwin使用资料 -
eren:
( ^_^ )不错嘛,收藏喽
Oracle Sqlplus 命令使用 -
楚若之夜:
好东西,顶起
[转贴]Oracle trigger实践 -
tigerli:
赞!
收集到的cygwin使用资料
一篇关于oracle trigger的实践代码
sql 代码
- --[6]// Oracle Trigger
- ---------------------------------------------------------------------------------------------//
- --实例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_sal
- AS
- SELECT 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
- DECLARE
- CURSOR cur_emp IS
- SELECT deptno,COUNT(empno) AS total_emp,SUM(sal) AS total_sal FROM emp GROUP BY deptno;
- BEGIN
- DELETE 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_sal
- VALUES(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 AS
- SELECT * FROM employee;
- DESC old_employee;
- --创建触发器
- CREATE OR REPLACE TRIGGER tig_old_emp
- AFTER DELETE ON employee --
- FOR EACH ROW --语句级触发,即每一行触发一次
- BEGIN
- INSERT INTO old_employee
- VALUES(: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 AS
- SELECT tab1.tid,tname,ttel,tadr FROM tab1,tab2
- WHERE tab1.tid = tab2.tid;
- --创建触发器
- CREATE OR REPLACE TRIGGER tab_trigger
- INSTEAD OF INSERT ON tab_view
- BEGIN
- INSERT 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
- BEGIN
- IF :OLD.sal > :NEW.sal THEN
- DBMS_OUTPUT.PUT_LINE('工资减少');
- ELSIF :OLD.sal < :NEW.sal THEN
- DBMS_OUTPUT.PUT_LINE('工资增加');
- ELSE
- DBMS_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
- BEGIN
- INSERT INTO log_info
- VALUES(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;
- ------------------------------------------------------------------------------------------End//
发表评论
-
Tips of sqlplus
2007-11-14 10:13 11811, 如何用SQL导出存储过程 sql 代码 ... -
[转载]oracle日期操作方法
2007-08-27 11:03 4842在oracle中有很多关于日期的函数,如: 1、add_m ... -
[应用]试用oracle的function
2007-08-23 12:58 2069近日写了一些vew,用到了自定义funciton,都是多表连接 ... -
转贴:oracle 存储过程的一些基本语法
2007-08-01 15:06 10581.基本结构 CREATE OR REPLACE PROCE ... -
应用:通过存储过程返回集合
2007-08-01 09:44 13931,首先是oracle的存储过程,利用了cursor sql ... -
应用:将操作结果导入到文件中
2007-07-19 10:59 1115利用sqlplus的命令spool完成: sql 代码 ... -
应用:用dblink连接两个实例
2007-07-19 10:56 1310sql 代码 --============== ... -
Oracle Sqlplus 命令使用
2007-07-19 10:30 5910一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭 ... -
Oracle函数列表速查
2007-07-19 10:19 964PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并 ... -
Oracle数据库碎片整理
2007-06-08 13:54 1488Oracle 作为一种大型数据库,广泛应用于金融、邮电、电力、 ... -
oracle服务启动停止方法
2007-06-08 13:51 7453好久不用oracle,差不多 ... -
ORACLE常用Script
2007-06-08 13:48 12351、查看当前所有对象 SQL> select * f ... -
ORACLE之常用FAQ V1.0[转载]
2007-06-08 13:29 1188第一部分、SQL&PL/SQL [Q]怎么样查询特殊 ... -
应用:一个oracle存储过程--利用了cursor
2007-05-15 15:58 1240通过其它两个表的关系,来 更新某一个表的一个字段值, sq ...
相关推荐
易语言动网转贴.rar 易语言动网转贴.rar 易语言动网转贴.rar 易语言动网转贴.rar 易语言动网转贴.rar 易语言动网转贴.rar
由于现在流行的转贴工具都是基于浏览器的,转换速度比较慢,还得打开浏览器才能使用(同时受到浏览器版本限制)。 <br> 而这个小程序则完全不依赖于浏览器,以BFC采集器的UBB转换模块为基础,转换速度超快,...
易语言源码动网转贴.rar 易语言源码动网转贴.rar 易语言源码动网转贴.rar 易语言源码动网转贴.rar 易语言源码动网转贴.rar 易语言源码动网转贴.rar
jquery的转贴功能实现,一些网站的转贴链接都在里面有封装
收集了各位大神的冷备份步骤, 转贴,经过测试,按照这个描述的步骤执行,成功备份,中间没有任何问题
AIX5.3+HACMP+Oracle9I+Weblogic8.1安装实施报告 转贴 哈哈哈... 好东西分享
去除Html中的干扰码等(样例中以轻之国度的干扰码为例) 配置文件语法: 方法类型(整数) 最大匹配长度(整数) 字符串1(删除开头) 字符串2(删除结尾) 方法类型: 1:删除单行 2:删除行与行之间的
东度极品论坛转贴工具东度极品论坛转贴工具
在Redhat9下安装Oracle9 在安装之前有几个地方需要注意的: 你的交换分区最好有一个G左右那么大,第二你的硬盘分区最好也要有足够大的空间。 下面我那个转贴的中译本: 1、创建用户和组:
动网转贴.e.rar
[转贴]软件测试 从零开始
转贴一个网络设计的例子
动网转贴.zip易语言项目例子源码下载动网转贴.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考
论坛专用屏蔽干扰码转贴工具
[转贴]Symbian编程VC开发环境设置 (方便个人学习用,转载自 rocklys的专栏,转贴请搜索原作者) - waferham的专栏
论坛转贴工具提供常的转换追加,转换覆盖,预览贴子,分析超链接,屏蔽文字,图片,超链接,提供查找,替换等功能,HTML版! 支持IE浏览器,360浏览器,搜狗浏览器,火狐浏览器,谷歌chrome浏览器等主流浏览器,无需...
易语言动网转贴源码,动网转贴,窗口名,较验,搜寻,文件处理,打开指定文件,关闭指定文件,取出文件时间,监视文件,继续监视,关闭句柄,等待改变,发送消息,桌面窗口,窗口句柄,取窗口标题长度,取窗体标题
uchome2.0+一键转贴插件 本插件由开源插件网(sns.zhisoo.com)提供。 激励的文章!奋斗的捷径!成功的法则!创业的技巧!奋进的环境! 更重要的是你可以找到与你志趣相同的网友!一起探讨奋斗的目标! 加入我们...
使用Struts2开发Java Web应用程序(转贴)