Oracle 触发器的使用

Posted code never lies

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 触发器的使用相关的知识,希望对你有一定的参考价值。

一.触发器的作用

  触发器的作用类似拦截器.把一些针对数据库的DML操作(insert/update/delete/select)进行拦截,符合业务要求的进行操作,不符合要求的操作可以通过抛出异常来阻止

  说白了就是数据确认(after)与安全性检查(before),此外触发器不针对select操作

二.触发器的使用

  语法不再赘述,百度或者查阅oracle的文档都能找到

  以下的一些例子是基于scott用户下的emp表

1.创建语句级触发器insertEmpTrigger,当对表【emp】进行增加【insert】操作前【before】,显示\'插入了一条数据\'

  注意是单引号

 1 --创建触发器
 2 create or replace trigger insert_trigger
 3 before
 4 insert
 5 on emp
 6 for each row
 7 begin
 8         dbms_output.put_line(\'插入了一条数据\');
 9 end;
10 /

如果不加for each row即使一次插入多条数据,触发器仍然只工作一次(普通的语句触发器),for each row 使得这个触发器变成了一个行触发器

 

2.星期一到星期五,且9-21点能向数据库emp表插入数据,否则使用函数抛出异常,使用raise_application_error(\'-20000\',\'例外原因\')

说明:raise_application_error(error_number,error_message) 用于抛出自定义的异常 error_number为-20000 到 -20999 之间,error_message表示错误的信息

 注意:不能仅仅用整点来控制,必须要考虑分钟的问题

 1 create or replace trigger security_trigger
 2 before
 3 insert
 4 on emp
 5 for each row
 6 declare
 7         pday varchar2(10);
 8         phour number(2);
 9 begin
10         select to_char(sysdate,\'day\')  into pday  from dual; 
11         select ceil(to_char(sysdate,\'hh24.mi\'))   into phour  from dual;
12         if pday in (\'星期六\',\'星期日\') or phour not between 9 and 21  then
13                 raise_application_error(\'-20000\',\'非工作日不能插入数据\');
14         end if;
15 end;
16 /

 触发器创建之后,在周一的 21:57时已经不能插入数据

 

3.创建行级触发器checkSalaryTrigger,涨后工资这一列,确保大于涨前工资(10%) (:new.sal/:old.sal的使用)

  :new.列名:old.列名 分别表示 某列的新值与旧值,而且这两个变量只有在创建触发器时加上for each row才会出现

 此外update二者皆有,insert只有:new,delete只有:old(上面已经说过,触发器不针对select操作)

 1 create or replace trigger checkSalary_trigger
 2 after
 3 update
 4 on emp
 5 for each row
 6 begin
 7         -- 伪变量:new.sal表示更新后的sal字段
 8         -- 10% 要写成 0.1
 9         if (:new.sal - :old.sal) < :old.sal*0.1 then
10             raise_application_error(\'-20000\',\'工资涨幅必须大于10%\');
11         else 
12             dbms_output.put_line(\'更新成功!\');
13         end if;
14 end;
15 /

 

 

以上是关于Oracle 触发器的使用的主要内容,如果未能解决你的问题,请参考以下文章

sql Oracle代码片段

片段创建的 Intent 不会触发 onNewIntent

导航到另一个片段时触发 API 调用

在 Oracle 触发器代码中使用“exec”并失败

如何设置 vscode 的代码片段,以便在自动完成后自动触发 vscode 的智能感知?

前端防扒代码片段