35.表级和行级DML触发器

一、引言

        触发器类似于过程和函数,都有程序主题部分(声明段、可执行段、异常处理段),但是调用其和函数不同,触发器为依靠事件执行的,且由于其是隐式调用的,触发器没有参数。
        本文主要介绍oracle中的DML触发器,顾名思义就是执行DML语句对表进行增、改、查时执行的触发器。
        我们先创建如下的表myemp:
create table myemp (empno number constraint empno_pk primary key ,ename varchar2(20),sal number,comm number);

二、DML表级触发器

        所谓DML表级触发器,是指每操作一次表就会触发一次的触发器,即使批量修改了表中的数据也只会触发一次。我们要创建一个触发器,作用就是检查向表中插入或者删除数据时,当前的日期是否是1号,如果不是1号,就抛出异常提升用户必须在每月1号进行入职和离职手续的办理:
create or replace trigger myemp_trigger before insert or delete on myemp
declare
  v_date varchar2(20);
begin
  select to_char(sysdate,'dd') into v_date from dual;
  if v_date!='01' then
    raise_application_error(-20008,'在每月的1号才能办理离职和入职手续!');
  end if;
end;
/
        我们可以看到创建触发器的语法:
(1)关键字before表示触发的时机,是在插入数据前,如果改成after表示触发时机是在插入数据后。
(2)insert or delete表示触发的DML语句是哪类,如果还有支持update语句,那就应该是insert or update or delete
(3)on myemp表示在哪个表上触发有效。
(4)接下来就是触发器的声明区和执行区代码段,我们也可以加入异常处理区Exception。不过和存储过程以及存储函数不同的是触发器的声明区是以declare开始的,而非as或者is。
        接下来我们如果想myemp表中插入一条数据,如果日期不是1号,就会报错:


三、DML行级触发器

        行级触发器,就是每操作表中的一行数据就会触发一次,在批量操作中,批量操作了多少行,就会触发多少次。接下来我们用行级触发器来实现向myemp表中插入数据时empno的自增长:
        首先,我们要先定义一个序列用于控制自增长的值:
create sequence empno_seq start with 1 increment by 1;
      下面是行级触发器的定义:
create or replace trigger myemp_row_trigger before insert on myemp
for each row
declare
  v_empno myemp.empno%type:=empno_seq.nextval;
begin
  :new.empno:=v_empno;
end;
/
        可以看到和表级触发器的声明主要不同之处在于:
(1)增加了for each row子语句,表明这是行级触发器。
(2)在行级触发器中我们可以使用变量:new表示在插入数据行前将要插入的新行,同样:old表示在删除数据行前需要删除那一行数据。在我们上面的代码中,我们在插入数据行之前将新行的empno改成了由序列提供的自增长的值,这样每次都实现了empno的自增长。

        如果我们插入两行数据,发现已经实现了empno的自增长:
insert into myemp values(1,'Hyman',2000,300);
insert into myemp values(1,'Tom',2000,300);




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值