Oracle-函数-语句级触发器-行级触发器

函数定义的格式

create or replace function 函数名 (参数名 参数类型,…)
return datatype
is 局部变量
begin
函数体
return 返回值
end 函数名;

触发器的定义格式

触发器往往涉及两个操作/事件,一个主动引发,一个被动自动执行
create or replace trigger 触发器名
before/after/instead of --触发时间
insert/update/delete --触发事件(通常是对数据中的表的操作)
on 表名
begin
触发体(被引发的操作/被动自动执行的操作)
exception
end 触发器名;
分类:
(1)语句级:不管主动执行事件影响到数据库中多少行数据,触发体只被执行一次
(2)行级(for each row):主动执行事件影响到数据库中多少行数据,触发体就执行多少次

语句级触发器实例

对emp表的操作进行记录(只要用户对emp表进行任何操作,都会进行记录)
首先建一个表

create table emp_lg( who varchar2(20),when date);

触发器

create or replace trigger emp_op

before insert or update or delete

on emp

begin

	insert into emp_lg(who,when) values(user,sysdate);

end emp_lg;

在这过程中,因为是before,所以只要在操作中,无主键冲突,无编译错误,无其他错误,只要影响到了数据库,就会触发,比如delete一个不存在的值,会被记录,因为它成功执行了,对数据库有了影响(使这个不存在数据库中),还有insert一个有主键错误的,它不会记录,因为没有影响到数据库(没有插入到数据库中),这个影响很有深意,得慢慢琢磨
如果对于某一列进行操作时

before insert or update or delete of 字段名

行级触发器实例

create or replace trigger emp 
before insert
on emp


create table emp_log(who varchar2(20),when date);

create or replace trigger emp_op

before insert or update or delete

on emp
for each row
begin

	insert into emp_lg(who,when) values(user,sysdate);

end emp_lg;

还可以更精确的记录,在这简单写一下,需要修改表结构,我这没修改了

create or replace trigger emp_op

before insert or update or delete

on emp
declare
v_act varchar2(20);
for each row
begin
if inserting then
v_act:='insert';
elsif updating then
v_act:='updating';
elsif deleting then
v_act:='deleting';
end if;
	insert into emp_lg(who,when,action) values(user,sysdate,v_act);

end emp_lg;

猜你喜欢

转载自blog.csdn.net/qq_43520913/article/details/106077159