plsql(轻量版)_触发器

本文深入讲解了数据库触发器的概念,包括其工作原理、类型(如行级和语句级触发器)、如何创建和使用触发器,以及触发器在数据操作(如增删改查)中的应用。
触发器是许多关系型数据库系统都提供的一项技术,在ORACLE系统里,触发器类似过程和函数,都有声明,执行和

异常处理过程的PL/SQL块,这是他创建的一个格式,这个触发器的作用是什么,触发器以独立的对象存储,就像你在这儿一样

能够看到,这是函数了,这里就是触发器

然后呢,与存储过程不同的是,存储过程使用其他程序来启动运行,或者直接启动运行,我们使用declare,

begin去调用这个函数,就像JAVA里的方法一样,用这个对象来掉,而这个触发器不一样,触发器是使用一个事件来

启动运行的,触发一个事件,事件一启动,一运行,我触发器就运行,触发器是当某个事件发生时自动的隐式的运行,你看不着,

但有的时候是看不着的,并且触发器是不能够接收参数的,所以运行触发器的过程叫做,触发或者点火,ORACLE事件指的是对

表进行的增删改,类似的一个操作,这个叫触发,触发器需要你关注的点,有这样几个,一个是触发器事件,就是因为什么会导致

他的发生,DML里面的增删改,它会导致触发事件的发生,那这个触发的事件是在你触发的事件之前,还是在之后,触发器本身,

就是你触发器本身想干什么,就是你触发器本身的操作,触发的频率,频率分成两个,一个叫语句级,一个叫行级,如果你进行一个

update的操作,update你想把所有人的数据都加100,都加100,你是需要我在整个都加完以后,触发一次,还是每加一个人就触发一次,

这就分成了语句级和行级,行级就是update一次就触发一次,语句级是整个update完了以后,当然也不一定以后,就是你是想前还是后呢,

然后触发一次,这就是触发器需要理解的四块

具体怎样来声明,这样的格式,create or replace trigger,触发器名,然后你是要在事件之前或之后执行,

触发事件是增删改哪一个,然后是作用哪一个表里的,是一个行级的还是一个语句级的,是这样一个过程,

写一个helloworld触发器

一个helloworld级别的触发器
create or replace trigger hello_trigger
after 
update on employees
--for each row
begin 
    dbms_output.put_line('hello...');
    --dbms_output.put_line('old.salary:'|| :OLD.salary||',new.salary'||:NEW.salary);
end;
然后执行:update employees set salary = salary + 1000;

就是当你每更新employees表的时候,就执行一次,每更新一次employees表我就给你插入一下,create or replace

trigger,然后叫update emp这个表的,trigger,然后你是想还是之后,之后after,after update on,employees这个表,

然后你是每一行都要这样操作吗,是的话就写false,for each row,然后呢你想干什么,你想干什么,你想干什么就写begin,

后边让他去执行,begin,dbms_output.put_line,每执行一次就让你输出helloworld,end结束

create or replace trigger update_emp_trigger

after

	update on employees
	
for each row

begin

	dbms_output.put_line('helloworld');
	
end;

创建好了,创建好了你在这看,当你每次对employees表进行Update的时候,我就触发这个事件,

update employees set salary = salary + 100;

我要这样写的话所有的都执行了,比如where department_id = 80,80号部门的全增加100,

当你一执行update,他就触发他的事件

80号部门有34个人,然后你可以trigger1,当你update他的时候,不让你每行都执行,就是最后执行一下,把这个

给他去掉

create or replace trigger update_emp_trigger1

after

	update on employees
	
begin

	dbms_output.put_line('helloworld');
	
end;

然后执行这个,就一条

update employees set salary = salary + 100 where department_id = 80

34条update,但是只输出一个,这个就是叫触发器,实际上你没有调触发器,触发器是自动执行的

28. 触发器的 helloworld: 编写一个触发器, 在向 emp 表中插入记录时, 打印 'helloworld'

create or replace trigger emp_trigger
after 
insert on emp
for each row
begin
       dbms_output.put_line('helloworld');
end;

当你每插入的时候让你执行,刚才我们创建的叫update,你创建这个触发器,仅仅你这个update的时候

有效,假设你要给他insert一条数据的时候,无效的,这个表太大了,insert的时候听呕心的,我创建一条吧,

create table emp,as select employee_id,salary,email from employees

create table emp1

as

select employee_id,salary,email from employees

where department_id = 80

创建了一个table,然后我创建一个触发table的一个触发器,然后让他作用在emp1上,这个触发器,仅仅这个表的update操作

create or replace trigger update_emp_trigger1

after

	update on emp1
	
begin

	dbms_output.put_line('helloworld');
	
end;

改个名trigger2

create or replace trigger update_emp_trigger2

after

	update on emp1
	
begin

	dbms_output.put_line('helloworld');
	
end;

当你update,emp1,set salary = salary + 100,就这样

update emp1 set salary = salary + 100;

我们这个是语句及的,当你想执行比如说insert,insert操作你看会不会触发,添加了,并没有导致触发器的

执行

insert into emp1

values (1001,20000,'aa@gmail.com');

因为你是插入的,插入操作不会触发他,你要想触发你得有一个insert的,insert on这个表

create or replace trigger insert_emp_trigger3

after

	insert on emp1
	
begin

	dbms_output.put_line('helloworld');
	
end;

这个创建好了,来一个1002吧

insert into emp1

values(1002,20000,'aa@gmail.com')

我insert就触发他了,这个我们就往下走吧

29. 行级触发器: 每更新 employees 表中的一条记录, 都会导致触发器执行

create or replace trigger employees_trigger
after 
update on employees
for each row
begin
       dbms_output.put_line('修改了一条记录!');
end;

语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次

create or replace trigger employees_trigger
after 
update on employees
begin
       dbms_output.put_line('修改了一条记录!');
end;

没更新就触发他,这个我们已经说了

30. 使用 :new, :old 修饰符

create or replace trigger employees_trigger
after 
update on employees
for each row
begin
       dbms_output.put_line('old salary: ' || :old.salary || ', new salary: ' || :new.salary);
end;

有一个这个概念,冒号new,冒号old,当你update一个表的时候,冒号old,比如我想update salary,工资都涨一百,

那么涨一百以后,我想看看旧的工资是多少,我们就可以使用这两个符号,你看这个,这里边的2跟3是我们刚创建的,

这个是作用在emp1的,进行update的

select * from emp1;

这是这个表的信息

然后我现在update他,我先改一下触发器,这里有触发器,怎么改,作用在每一行上,不打印这个了,打印当你update的

时候,旧的那个值,新的值没有打出来,old:salary,这是字符串,双竖线冒号,old.salary,后面new salary,冒号new点salary,

输出一下update之前的那个值,和之后的值

create or replace trigger update_emp_trigger

after

	update on emp1
	
for each row

begin

	dbms_output.put_line('old:salary'||:old.salary||','||'new salary:'||:new.salary);
	
end;

创建好了,创建好了以后,update,emp1,set,salary = salary +100,这是个旧的,2万加上100以后的

update emp1 set salary = salary + 100;

那这个很有用,我可以把更新之前的值和之后的值都获取到,如果你只想要旧的,为啥说他挺好,你看这个题

31. 编写一个触发器, 在对 my_emp 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录

1). 准备工作:
	create table my_emp as select employee_id id, last_name name, salary sal from employees
	create table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2

2). 
create or replace trigger bak_emp_trigger
       before delete on my_emp
       for each row
       
begin
       insert into my_emp_bak values(:old.id, :old.name, :old.sal);
end; 

编写一个触发器,在堆这个表进行删除的时候,在这个表当中再进行对应备份表的记录,这边在删除,实际上他导致了触发器

的执行,触发器你删一条我就加一条,你删完了我就给你复制过来了,当然前提现在有两个表,这个表的所有数据都拿过来了

create table my_emp

as

select employee_id,salary from employees

我这个时候

select * from my_emp;

create table my_emp_bak

as

select employee_id,salary from employees 

where 1=2

当你这个时候

select * from my_emp_bak;

这个表是空的

这个表有,这个表没有,我现在呢,当你把这个表清空的时候,create or repalce trigger,delete emp表的时候,

before,delete,on my_emp,for each row,begin,怎么执行,当你一删除这个表的时候,我就insert into,my_emp_bak,

values,这个表的表结构,怎么获取到,冒号old点employee_id,逗号冒号,这样的,能看懂不,当你一删除的,删除的时候

就触发这个,我就把你这个old,你要删的表的旧的信息添加到新表里

create or replace trigger delete_emp_trigger

before

delete on my_emp

for each row

begin

	insert into my_emp_bak
	
	values(:old.employee_id,:old.salary);
	
end;

delete from my _emp;

清空

这个时候

select * from my_emp;

select * from my_emp_bak;

就是你刚刚删的,这个就是触发器,然后你这个时候要给他commit

commit;

触发器就是这样的,它是自动给你执行的,看不到,整个就讲完了PL/SQL,大家你需要掌握的,

实际上是这两个,前面的都集成到这里了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值