日历

2008 8.20 Wed
     12
3456789
10111213141516
17181920212223
24252627282930
31      
«» 2008 - 8 «»

文章搜索

日志文章

2007年09月21日 00:15:51

pl/sql编程之触发器

触发器是当特定事件出现时自动执行的代码块.触发器与过程的区别在于:过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的.
触发器能够执行的功能有:
1.自动生成数据.
2.强制复杂的完整性约束条件.
3.自定义复杂的安全权限.
4.提供审计和日志记录.
5.启用复杂的业务逻辑.
触发器的类型有:
1>行级触发器.(行级触发器对DML语句影响的每个行执行一次)
实例一:
--触发器
--行级触发器
create table test(sid number,sname varchar2(20));--创建一个表
create sequence seq_test;--创建序列
create or replace trigger tri_test--创建触发器
before insert or update of sid
on test
for each row--触发每一行
begin
if inserting then
select seq_test.nextval into:new.sid from dual;
else
  raise_application_error(-20020,'不允许更新ID值!');--中断程序  
end if;
end;

--测试,插入几条记录
insert into test values(0,'ff');
insert into test values(0,'ff');
insert into test values(0,'tt');

输出结果如下图所示:



实例二:
--创建一个触发器,无论用户插入新记录,还是修改emp表的job列,都将用户指定的job列的值转换成大写.

create or replace trigger trig_job
before insert or update of job
on emp
for each row
begin
if inserting then
:new.job:=upper(:new.job);
else
:new.job:=upper(:new.job);
end if;
end;

2>语句级触发器.(语句级触发器对每个DML语句执行一次)
实例:
create or replace trigger tri_test
after insert or update or delete
on test
begin
if updating then
dbms_output.put_line('修改');
elsif deleting then
dbms_output.put_line('删除');
elsif inserting then
dbms_output.put_line('插入');
end if;
end;

3>instead of 触发器.(此触发器是在视图上而不是在表上定义的触发器,它是用来替换所使用实际语句的触发器.)
语法如下:
create or replace trigger trig_test
instead of insert or update on 表名
referencing new as n
for each row
declare
..........
begin
........
end;
4>模式触发器.
可以在模式级的操作上建立触发器.
实例如下:
create or replace trigger log_drop_obj
after drop on schema
begin
insert into .....
end;
5>数据库级触发器.
可以创建在数据库存事件上的触发器,包括关闭,启动,服务器错误,登录等.这些事件都是实例范围的,不与特定的表或视图关联.
实例:
create or replace trigger trig_name
after startup on database
begin
...........
end;

OK,大概就这些了.


Tags: pl sql  

类别: oracle |  评论(2) |  浏览(2511) |  收藏
一共有 2 条评论
2楼 [匿名]http://hi.baidu 2008年01月10日 09:54:27 Says:
很好 收藏了 不建议吧 谢谢!
1楼 三笑数码科技--电脑扩展主机Ne.. 2007年09月25日 13:25:27 Says:
写的好到此一游
发表评论