- 浏览: 62012 次
- 来自: 上海
最新评论
create or replace trigger updEmp_trig before update on emp for each row declare -- local variables here begin dbms_output.put_line('触发器被触发了...'); --设计要求,将更新以后的工资插入一张新表emp2中, --这个新表的结构与EMP表中雇员的基本信息一致 insert into emp2(empno,ename,sal) values(:old.empno,:old.ename,:new.sal); dbms_output.put_line(:old.empno||' 号雇员,姓名为:'||:old.ename||' , 他的工资由 '||:old.sal||' 变化到了 '||:new.sal); end updEmp_trig; --只能够通过前触发器完成此项任务,不可以是后触发器 create or replace trigger employees_ins_trigger before insert or update on employees referencing old as old_value new as new_value for each row --只有不等于80部门的数据才导致触发器工作 when (new_value.department_id<>80) declare -- local variables here begin --只有80部门的雇员能够获得COMMISSION_PCT的值,其它部门的值设为0 --将commission_pct的值设置为0 :new_value.commission_pct:=0; end employees_ins_trigger; --假设使用后触发器会怎么样? --触发器编译报错。因为按照业务逻辑,为了实现这个业务,必须使用前触发器。 --只能够通过前触发器完成此项任务,不可以是后触发器 create or replace trigger employees_ins_trigger after insert or update on employees referencing old as old_value new as new_value for each row --只有不等于80部门的数据才导致触发器工作 when (new_value.department_id<>80) declare -- local variables here begin --只有80部门的雇员能够获得COMMISSION_PCT的值,其它部门的值设为0 --将commission_pct的值设置为0 :new_value.commission_pct:=0; end employees_ins_trigger; --只有在工作时间才能够对HR用户的EMPLOYEES表和DEPARTMENTS表做DML操作 --工作时间定义为 8:00AM——17:00PM create or replace trigger emplyoees_limits_trig before insert or update or delete on employees for each row declare -- local variables here v_timestr varchar2(30); begin --只有在工作时间才能够对HR用户的EMPLOYEES表和DEPARTMENTS表做DML操作 --工作时间定义为 8:00AM——17:00PM --对系统时间作出分析,如果对操作时间进行分解以后,判断小时数小于8:00 --或者小时数大于17:00,则引发错误。 select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') into v_timestr from dual; if(小时数<8 or 小时数>17) then raise_application_error(-20001,'非工作时间,不能进行DML操作'); end if; end emplyoees_limits_trig; --认识行级触发器与语句级触发器的区别 create or replace trigger updEmp_stmt_trig before update on emp declare -- local variables here begin dbms_output.put_line('语句级触发器被触发了...'); end updEmp_trig; create or replace trigger updEmp_trig before update on emp for each row declare -- local variables here begin dbms_output.put_line('触发器被触发了...'); --设计要求,将更新以后的工资插入一张新表emp2中, --这个新表的结构与EMP表中雇员的基本信息一致 insert into emp2(empno,ename,sal) values(:old.empno,:old.ename,:new.sal); dbms_output.put_line(:old.empno||' 号雇员,姓名为:'||:old.ename||' , 他的工资由 '||:old.sal||' 变化到了 '||:new.sal); end updEmp_trig; --自动派生值 --当我们向一张数据表中插入数据时,希望id这个列的值能够自动增长(初始值为1000), --每次增加1 create table testtab( newsid number not null, newstitle varchar2(50), newstype varchar2(30) ); insert into testtab values(999,'意大利与新西兰1:1战平','世界杯新闻'); select * from testtab; insert into testtab values(88,'西安地区最近持续高温','社会新闻'); --为了解决这个问题,需要两个数据库对象,并且他们还需要关联以后才能够解决 --第一个对象是序列或者序号 create sequence testtab_seq minvalue 1000 maxvalue 999999 start with 1000 increment by 1; --testing insert into testtab values(testtab_seq.nextval,'意大利与新西兰1:1战平','世界杯新闻'); insert into testtab values(testtab_seq.nextval,'西安地区最近持续高温','社会新闻'); insert into testtab values(66,'西安地区最近持续高温','社会新闻'); insert into testtab values(4500,'西安地区最近持续高温','社会新闻'); select * from testtab; --第二步需要将序号和触发器关联 commit; --只能够通过前触发器完成此项任务,不可以是后触发器 create or replace trigger employees_ins_trigger before insert or update on employees referencing old as old_value new as new_value for each row --只有不等于80部门的数据才导致触发器工作 when (new_value.department_id<>80) declare -- local variables here begin --只有80部门的雇员能够获得COMMISSION_PCT的值,其它部门的值设为0 --将commission_pct的值设置为0 :new_value.commission_pct:=0; end employees_ins_trigger; create or replace trigger testtab_trig before insert on testtab for each row declare -- local variables here begin --当插入数据之前,从序号中派生值赋给insert语句中的newsid --这样就保证了newsid中的值一定是从序号中获取的 select testtab_seq.nextval into :new.newsid from dual; end testtab_trig;
发表评论
文章已被作者锁定,不允许评论。
-
ORACLE日期时间处理
2013-01-25 17:56 1286--感觉ORACLE对日期的处理比MS较方便些 --修改会 ... -
AutoTrace执行结果说明
2013-01-25 14:11 831统计信息 --------------- ... -
QUESTIONS
2011-11-25 08:51 706问题一:获取SCOTT用户中EMP表里最早入职的前五名雇员? ... -
闪回数据库技术
2011-11-25 08:51 1185SQL> conn / as sysdba;已连接 ... -
包实例
2011-11-24 09:16 772SQL> col object_name f ... -
存储过程、函数简单应用
2011-11-24 09:16 1012create or replace procedure ... -
ORACLE体系结构
2011-11-24 09:15 854001、oracle体系结构: oracle产品和 ... -
游标简单操作
2011-11-25 08:50 1255--显示游标 处理检索多行数据 --whil ... -
数据泵导出导入(SCHEMAS)
2011-11-25 08:51 8586一、导出 1、 cmd-->C:\Docume ... -
PLSQL developer连接oracle
2011-11-25 08:50 1028装好ORACLE 10g后,安装plsql ... -
ORACLE安装前后
2011-11-24 09:17 861安装前:计算机名必须小于8位(不能以数字开 ... -
数据库事务
2011-11-22 11:24 929查看数据库默认隔离级别: 查看InnoDB系统级别 ... -
导入TXT文件与导出TXT
2011-11-28 10:05 1056导入.TXT文件与导出*. ... -
加载数据
2011-11-28 10:05 8951、使用LOAD DATA语句要比INSERT语句的加载 ... -
字符串连接
2011-11-28 10:05 849mysql> select 'abc'+'123' ... -
DELETE语法
2011-11-28 10:06 1647仅仅在 FROM 或 USING 子句之前列出的表中的匹 ... -
复制表
2011-11-22 11:24 794创建测试表test:mysql> create tabl ... -
定时执行存储过程
2011-11-18 22:46 998存储过程学习:http://www.111 ... -
计算机localhost在网络上不存在
2011-11-22 11:22 1043计算机localhost在网络上不存在——数据库 ... -
EXPLAIN语法
2011-11-29 09:09 920EXPLAIN table == DESC table ...
相关推荐
### Oracle数据库触发器实例解析 #### 一、触发器简介 在Oracle数据库中,触发器是一种存储过程,它被设计为当特定事件(如数据插入、更新或删除)发生时自动执行。触发器可以用于执行复杂的业务逻辑或者数据完整...
Oracle 触发器实例讲解 Oracle 触发器是一种特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。它主要有以下几个功能: 1. 允许/限制对表的修改:触发器可以控制对表的修改操作,...
### SQL触发器实例加解析 #### 一、SQL触发器概念与作用 SQL触发器是一种存储过程,它在数据表中的数据被修改(插入、更新或删除)时自动执行。触发器可以用来确保数据完整性,并且可以实现复杂的业务逻辑。 ####...
在"数据库两大难点"的文件中,可能涵盖了如何设计和实现存储过程、触发器以及权限架构的具体实例。学习这些内容有助于提升对数据库管理的理解,解决实际项目中遇到的问题,如数据一致性、性能优化和安全防护。 总的...
SQL 触发器实例讲解 SQL 触发器是一种特殊的存储过程,用于在数据库中执行某些操作时自动触发某些事件。触发器可以应用于 Insert、Update、Delete 事件等。 什么是触发器? 触发器是一个特殊的存储过程,在 SQL ...
SQL 触发器实例讲解 SQL 触发器是一种特殊的存储过程,它可以在对某一个表进行操作时触发某种条件,从而执行一段程序。触发器可以应用于 Insert、Update、Delete 等事件,以确保数据的一致性和完整性。在本文中,...
本资料集包含了大量的触发器实例,旨在帮助读者深入理解和熟练运用数据库触发器。 一、触发器类型 触发器主要分为三种类型:DML触发器、DDL触发器和Logon触发器。DML触发器在数据操纵语言(Data Manipulation ...