Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369859
  • 博文数量: 100
  • 博客积分: 2586
  • 博客等级: 少校
  • 技术积分: 829
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 15:20
个人简介

我是一个Java爱好者

文章分类

全部博文(100)

文章存档

2014年(2)

2013年(7)

2012年(2)

2010年(44)

2009年(28)

2008年(17)

我的朋友

分类: Oracle

2009-05-20 11:44:04

oracle 行触发与语句触发的区别:

1、行触发器有 for each row子句。语句触发器没有for each row 子句。
2、行触发器,可以有 when 作为触发限制,可以使用new/old。语句触发器不能有when 作为触发限制。
3、行触发器:对应DML语句所影响到的表中的每一行,触发器都要执行一遍。
4、语句触发:对应DML语句所影响到的表中的所有行,触发器只执行一遍。

 

例子:

--测试表
create table wdt_test(test number(20));

--日志表
create table wdt_log(log_no number(20), log_date date);

--触发器
create or replace trigger buf_wdt_test
    before update on wdt_test

--referencing new as new_record --新记录
            --old as old_record
    --for each row
declare
    ln_log_no wdt_log.log_no%type default 0;
begin

    select nvl(max(log_no), 0) + 1
      into ln_log_no
      from wdt_log;

    insert into wdt_log
        (log_no,
         log_date)
    values
        (ln_log_no,
         sysdate);
end;

--测试
SQL> insert into wdt_tset (test) values(11);
SQL> insert into wdt_tset (test) values(22);
SQL> insert into wdt_tset (test) values(33);

SQL> update wdt_test set test = 88;
SQL> select * from wdt_log order by log_no; --结果只有1条记录、证明触发器只工作了一次

将触发器代码中的 for each row 解开注释,变成行触发,再继续测试。

SQL> update wdt_test set test = 99;
SQL> select * from wdt_log order by log_no; --结果有3条记录、证明触发器按行工作了3次

阅读(833) | 评论(0) | 转发(0) |
0

上一篇:批处理教程

下一篇:eclipse cvs注意事项

给主人留下些什么吧!~~