代码改变世界

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

  钟铧若岩  阅读(2260)  评论(1编辑  收藏  举报

背影如下:

表名,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;

 

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示