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