代码改变世界

Oracle 触发器 删除操作时再查询本表数据 功能不正确

2015-02-13 13:12  钟铧若岩  阅读(2248)  评论(0编辑  收藏  举报

背影如下:

表名,WFGTEST

1 create table WFGTEST
2 (
3   NAME1    VARCHAR2(256) not null,
4   NAME2    VARCHAR2(256),
5   CAPACITY NUMBER(20,3)
6 )

表结构如下:

 

NAME1NAME2CAPACITY
wfg wfg 1.000
qq qq 1.000
lxx lxx 2.000
wly wly 2.000

 

现在想实现的效果如下:

如果这个表里相同的CAPACITY都被删除完时,向另一个表里插入一个计数,

如1.000被全部删除完时,向另一个表里插入记录如下,也就是说DELETE时,需要再查询本表是否还有与此次删除相同的CAPACITY,如果没有,那么就向另一个表里添加记录

CAPACITYTYPE DELETETIME
1.000   2015/02/13

那么这个触发器应该怎么写呢?

 1 CREATE OR REPLACE TRIGGER "TRIGGER_WFGTEST" AFTER
 2 DELETE ON "WFGTEST" FOR EACH ROW 
 3 DECLARE nRMSFLAG number;
 4 nFindSelft number;
 5 
 6 pragma autonomous_transaction;
 7 
 8 BEGIN
 9   ---------------------------------------------------------------------------------
10     IF DELETING  THEN
11        SELECT COUNT(*) INTO nFindSelft FROM WFGTEST WHERE CAPACITY =:OLD.CAPACITY;
12        IF nFindSelft =1 THEN
13                INSERT INTO "WFGTEST2" VALUES(:OLD.NAME2,sysdate);
14             END IF;    
15           commit;
16        END IF;
17        
18     END IF;
19    ----------------------------------------------------------------------------------
20    --END IF;
21  /* PLEASE CHANGE THE NAME*/
22 END TRIGGER_WFGTEST;

下面有两个SQL代码测试,有不明白的地方请高手指导:

1 --这样执行的话,无法统计
2 delete from wfgtest where capacity = 1.000;
3 commit;
4 
5 --这样执行就能统计,请问为什么?
6 delete from wfgtest where name1 = 'wfg';
7 delete from wfgtest where name1 = 'qq';
8 commit;