触发器

  触发器是一个与表相关联的,存储下来可以自动执行的PL/SQL程序。每当一个特定的数据操作语句(insert,update,delete)在指定的列上发出时,oracle自动地执行触发器定义的语句序列。虽然触发器对于很多事情特别方便,避免了我们手动的调用,但是却带来了一些其他问题,例如定义一个插入数据时主键编号自动增长的触发器,当其他用户进行数据操作时并不知道定义了该触发器,插入数据时会将主键编号也插入,就会出现操作错误。所以,虽然触发器有一定的优点,但是还是要少用。

一.分类

  1.语句级触发器

      在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。

  2.行级触发器(for each row)

      触发语句作用的每一条记录都被触发。只有在行级触发器中才能使用old和new伪记录变量,识别值得状态。

二.语法

  create [or replace] trigger 触发器名

  {before|after}

  {delete|insert|update[of 列名]}

  on 表名

  [for each row[when(条件)]]

  PL/SQL块

触发语句 :old :new
insert   将要插入的数据
update 将要更改的数据 更改后的数据
delete 将要删除的数据  

 

 

 

 

  示例一:插入数据时id自动增长

--创建表
create table ttemp2
(id number(10) primary key,
name varchar2(29) not null
);
--创建序列
create sequence myid;
--创建触发器
create or replace trigger tri_id
before insert on ttemp2
for each row
declare
  mid number;
begin
  select myid.nextval into mid from dual;
  :new.id := mid;
end;
--插入数据时id自动增长
insert into ttemp2(name) values('gyx'); 

  示例二:插入数据时姓名不能以J开头

--定义触发器
create or replace trigger tri_t1
before insert on ttemp2
for each row
declare
begin
  dbms_output.put_line(:new.id||' '||:new.name);
  if :new.name like 'j%' then
    RAISE_APPLICATION_ERROR(-20000,'限制写入以J开始的串');
  end if;
end;
--插入数据
set serveroutput on;--打开控制台输出
insert into ttemp2(name) values('jxws');

  示例三:在触发器内部判断是哪种操作

create or replace trigger tri_t2
before insert or update of name or delete on ttemp2
declare
begin
  if inserting then
    dbms_output.put_line('这是插入数据');
  elsif deleting then
    dbms_output.put_line('这是删除数据');
  else 
    dbms_output.put_line('这是更新数据');
  end if;
end;
rollback;
select * from ttemp2;
set serveroutput on;
--测试插入语句
insert into ttemp2(name) values('gyxx');
--测试更新语句
update ttemp2 set name = 'xws' where name = 'gyx';  --该语句触发触发器
update ttemp2 set id = 200 where id = 1;  --该更新语句不能触发触发器,只有对name列的更新才能触发

三.查看触发器,存储过程,函数

  1.查看触发器

select * from SYS.user_triggers;

  2.查看存储过程

select * from user_procedures;

  3.查看函数

select * from user_source where type='FUNCTION';

  4.查看触发器、存储过程、函数

select * from user_source;

 

posted @ 2015-09-19 09:03  竹沥半夏  Views(839)  Comments(1Edit  收藏  举报