oracle触发器的基本语法使用介绍

自己本来想研究一下触发器,然后就根据网上的内容进行了学习,并发下一自己的感想!

一、触发器

触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用。

触发器分为两类:

一种是系统触发器:由系统事件触发的PL/SQL,比如登陆oracle数据库,登出oracle。

另一种是DML触发器:由DML语句触发的PL/SQL,比如INSERT、UPDATE、DELETE等。

我们一般用到的是DML触发器,所以我们接下来就介绍一下这种触发器:

DML触发器:

让我们先建两张表,students,banji;

create table students(
       stuid number not null,
       sname varchar2(20) not null,
       ban  number not null
);

insert into students VALUES (1,'zhangsan',10);
insert into students values (2,'lisi',10);
insert into students values(3,'wangwu',20);
commit;


create table banji(
       ban number,
       stusum number
);

insert into banji values (10,2);
insert into banji values (20,1);
commit;

1)语句触发器

语句级触发器则只触发一次,与语句所影响到的行数无关,别对只触发一次又误解,不是用一次就完了,而是每次对表进行DML操作是他只触发一次。

语法:

创建和测试语句触发器
CREATE [OR REPLACE] TRIGGER trigger_tname
   [before|after]    --在触发事件前还是后发生
   [update | OR insert | OR delete]    --触发事件
   ON table_name           --是哪张表
declare
 --变量声明区
begin
  trigger_body        --需要触发的事件
end;
/

例子:定义一个不在规定时间无法添加往students表中添加数据的触发器

create or replace trigger dml_students_time
   before                                --在触发事件发生前
   insert or update or delete      --触发事件为增删改
   on students             --对表students
begin                                                  --执行触发器体
   if to_char(sysdate,'HH24:MI') not between '08:00' and '18:00' 
      or to_char(sysdate,'DY') in ('SAT','SUN') 
   then 
      dbms_output.put_line('You may only make changes during normal office hours'); --不符合抛出
   end if;
end ;
/

测试:

update students set sname = 'liliu' where stuid = 3;

会出现错误提示,提示内容为:“无效且未通过请重新验证”。

2)行级触发器

行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,,可以这么理解,如果表中数据变得很频繁,那么执行效率会有影响。

语法:

创建和测试行触发器
CREATE [OR REPLACE] TRIGGER trigger_tname
     [before|after]    --在触发事件前还是后发生
     [update of 字段 | OR insert of 字段 | OR delete of 字段]    --触发事件of后可选择,不写代表整个表的所有行
      ON table_name              --是哪张表
     [REFERENCING OLD AS old|NEW AS new]  
      FOR EACH ROW
     [WHEN(condition)]
declare
 --变量声明区
begin
  trigger_body        --需要触发的事件
end;
/

 

二、查看触发器

select trigger_name from all_triggers where table_name='XXX';

三、删除触发器

--删除触发器--
drop trigger trigger_name;

trigger_name:触发器名称

before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发

table_name:表名,表示发生触发器作用的对象

for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器

when trigger_condition:添加的触发条件

trigger_body:触发体,是标准的PL/SQL语句块
 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值