30、PLSQL 触发器
Update date:
1、DML 级别的触发器
当进行dml(insert delete update)操作时,这些操作可以被数据库管理系统捕获到,捕获到这些行为之后 可以根据操作 进行相应的处理。
2、语法
create or replace trigger 触发器的名字 before|after dml(insert |delete | update)
on 表名 | for each row
declare
begin
end;
/
3、 举例
create table emp300 as select id,first_name name,salary from s_emp;
col name for a20;
为 emp300 这张表建立一个更新操作之后的 触发器
create or replace trigger emp300_after_update after update on emp300
declare
begin
dbms_output.put_line('warning you update emp300');
end;
/
update emp300 set salary=salary+100 where id=1;
update emp300 set salary=salary+100 where id<1;
update emp300 set salary=salary+100 where id>1;
无论sql语句影响多少行数据 上面的触发器 都会被触发一次 这种触发器 叫 语句级触发器。
4、开发中 比较有意义的是 针对每一行 都触发 这样才能获取到数据的具体变化
行级触发器 —- 针对sql语句影响的每一行都触发 for each row
create or replace trigger emp300_after_update after update on emp300 for each row
declare
begin
dbms_output.put_line(:old.id||':'||:old.salary);
dbms_output.put_line('warning you update emp300');
dbms_output.put_line(:new.id||':'||:new.salary);
end;
/
update emp300 set salary=salary+100 where id=1;
update emp300 set salary=salary+100 where id<1;
update emp300 set salary=salary+100 where id>1;
update :old :new
delete :old
insert :new
触发器中不能使用 事务控制语句
create or replace procedure getNumN(var_n number,var_sum out number)
is
begin
var_sum:=0;
for var_i in 1..var_n loop
var_sum:=var_sum+var_i;
end loop;
end;
/
------------------------------------------------------------------------------------------
declare
var_s number:=0;
begin
getNumN(100,var_s);
dbms_output.put_line('var_s='||var_s);
end;
/
constant not null
declare
var_x constant number not null:=0;
begin