`

触发器实例

阅读更多

 

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数据库触发器实例

    ### Oracle数据库触发器实例解析 #### 一、触发器简介 在Oracle数据库中,触发器是一种存储过程,它被设计为当特定事件(如数据插入、更新或删除)发生时自动执行。触发器可以用于执行复杂的业务逻辑或者数据完整...

    Oracle触发器 实例讲解

    Oracle 触发器实例讲解 Oracle 触发器是一种特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。它主要有以下几个功能: 1. 允许/限制对表的修改:触发器可以控制对表的修改操作,...

    sql触发器实例加解析

    ### SQL触发器实例加解析 #### 一、SQL触发器概念与作用 SQL触发器是一种存储过程,它在数据表中的数据被修改(插入、更新或删除)时自动执行。触发器可以用来确保数据完整性,并且可以实现复杂的业务逻辑。 ####...

    数据库存储过程+触发器实例+权限构架

    在"数据库两大难点"的文件中,可能涵盖了如何设计和实现存储过程、触发器以及权限架构的具体实例。学习这些内容有助于提升对数据库管理的理解,解决实际项目中遇到的问题,如数据一致性、性能优化和安全防护。 总的...

    SQL触发器实例讲解.pdf

    SQL 触发器实例讲解 SQL 触发器是一种特殊的存储过程,用于在数据库中执行某些操作时自动触发某些事件。触发器可以应用于 Insert、Update、Delete 事件等。 什么是触发器? 触发器是一个特殊的存储过程,在 SQL ...

    SQL触发器实例讲解(20211008070418).pdf

    SQL 触发器实例讲解 SQL 触发器是一种特殊的存储过程,它可以在对某一个表进行操作时触发某种条件,从而执行一段程序。触发器可以应用于 Insert、Update、Delete 等事件,以确保数据的一致性和完整性。在本文中,...

    触发器实例讲解--很多的很经典的资料

    本资料集包含了大量的触发器实例,旨在帮助读者深入理解和熟练运用数据库触发器。 一、触发器类型 触发器主要分为三种类型:DML触发器、DDL触发器和Logon触发器。DML触发器在数据操纵语言(Data Manipulation ...

Global site tag (gtag.js) - Google Analytics