AI智能
改变未来

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

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

一、触发器

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

触发器分为两类:

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

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

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

DML触发器:

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

[code]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操作是他只触发一次。

语法:

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

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

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

测试:

[code]update students set sname = \'liliu\' where stuid = 3;

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

2)行级触发器

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

语法:

[code]创建和测试行触发器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 --变量声明区begintrigger_body        --需要触发的事件end;/

 

二、查看触发器

[code]select trigger_name from all_triggers where table_name=\'XXX\';

三、删除触发器

[code]--删除触发器--drop trigger trigger_name;

trigger_name:触发器名称

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

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

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

when trigger_condition:添加的触发条件

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

 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » oracle触发器的基本语法使用介绍