当前位置:首页 > Oracle > 正文内容

Oracle 组合触发器的应用案例

管理员4年前 (2016-05-04)Oracle129

目前协助兄弟公司的一个开发人员整理一个早期的项目,期间有这样的一个需求:
有一张物资表,记录着库存数量,发放一个,该数量减一,直到数据减到0为止,现在系统中存在大量的数量为0的记录,因为是非重要的数据,要这些数据可以删掉,本来是一个很小的活,直接删除或者做一个定时任务即可,用户坚持要求在变成0的同时,删除掉(在我看来,用户就是不想在前台看到)这些数据,因原来的开发人员早已离职,并且已找不到源代码,想到在数据库上找找方法。
于是想到是否可以通过触发器的方式实现,在更新数据后,直接删除数量为0的行,这里用了一个组合触发器。
语法也比较简单,先定义一个数据行数的变量,在前表级触发器中初始它,在行级触发语句块中记录下那些为0行的id, 最后在后表级触发器的中统一删除它们。

create table test(id number, num number);

create or replace trigger trig_test_del_num0
  for update of num on test
  compound trigger  
  type list_type is table of integer index by pls_integer;
  list_id list_type;
  dwcount int;

  before statement is
  begin
    dwcount := 0;
  end before statement;

  before each row is
  begin
    if (:new.num = 0) then
      dwcount := dwcount + 1;
      list_id(dwcount) := :new.id;
    end if;
  end before each row;

  after statement is
  begin
    for c in 1 .. dwcount loop
      delete test where id = list_id(c);
    end loop;
    dwcount := 0;
  end after statement;
end;
/

测试一下,看看效果

SQL> insert into test
  2  select rownum, rownum * 100 from dual connect by rownum <=10;

10 rows inserted

SQL> select * from test;

        ID        NUM
---------- ----------
         1        100
         2        200
         3        300
         4        400
         5        500
         6        600
         7        700
         8        800
         9        900
        10       1000

10 rows selected

SQL> update test set num = 0 where id= 3;

0 rows updated

SQL> select * from test;

        ID        NUM
---------- ----------
SQL> update test set num= 0 where id in(5,7,9);

0 rows updated

SQL> select * from test;

        ID        NUM
---------- ----------
SQL> drop table test purge;

Table dropped
SQL>
打赏 支付宝打赏 微信打赏
    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由卖水果的net发布,如需转载请注明出处。

    转载请注明出处:http://www.msgde.net/oracle/oracle_compound_trigger.html

    标签: trigger
    分享给朋友:

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。