各位大侠:
小弟最近碰到一个问题,关于oracle触发器的,想请教下,具体如下:
有两个表A和B,A中有一个字段NUMOFB记录B中记录的个数,想创建一个触发器,在对B表
进行插入和删除的时候,更新A表中NUMOFB的内容。如何实现?
谢谢各位!
小弟最近碰到一个问题,关于oracle触发器的,想请教下,具体如下:
有两个表A和B,A中有一个字段NUMOFB记录B中记录的个数,想创建一个触发器,在对B表
进行插入和删除的时候,更新A表中NUMOFB的内容。如何实现?
谢谢各位!
解决方案 »
- 请问我在删除表时提示有主外键使用中,求解决方法和批量删除方法
- oracle PLS-00103: 出现符号 "MRID1"在需要下列之一时:language
- oracle中使用regexp_substr取值
- 求SQL语句
- Oracle的查詢
- 在字符到日期的类型转换中出现了错误,请问我怎么样才能找出是哪条记录出错。
- Instance和troubleshooting是个什么概念
- 急求问,我的oracle Management Serverl的用户名和密码如何找回??
- 请问如果访问远方数据库中的表
- Oracle8i不能在WINXP上安装吗?
- oracle10.1 内部变量字符串长度无效
- 个位大侠们,帮帮忙!!先谢了。
create or replace trigger test
AFTER INSERT OR DELETE ON B
for each row
declare
begin
if inserting then
update A set NUMOFB=NUMOFB+1;
else
update A set NUMOFB=NUMOFB-1;
end if;
end test;
/
-- 用包头作一个全局变量,记录触发器触发次数;
-- 并创建一个before trigger 和-个after trigger,它们作用分别为统计影响的记录数 和 将影响的记录数写入A表;
-- (made by sleepzzzzz)CREATE OR REPLACE PACKAGE pkg_test AS-- 创建全局变量
v_recordcount number := 0;
END pkg_test;
/ create or replace trigger name_tri -- 统计行级触发的次数,其实就是统计影响的记录数
before insert or delete on tableB
for each row
begin
if inserting then
pkg_test.v_recordcount := pkg_test.v_recordcount + 1;
else
pkg_test.v_recordcount := pkg_test.v_recordcount - 1;
end if;
end name_tri;
/create or replace trigger name_tri_after
after insert or delete on tableB
begin
update tableA set NUMOFB = NUMOFB + pkg_test.v_recordcount; -- 更新A表
pkg_test.v_recordcount := 0; -- 每次触发完毕进行清零
end name_tri_after;
/
-- 测试:
SQL> select * from tableA; -- 原始值为1 NUMOFB
----------
1SQL> insert into tableB select id,name from test3; -- 表test3有万条记录10000 rows insertedSQL> select * from tableA; -- 批量增加2条后,总数+1W NUMOFB
----------
10001SQL> delete from tableB where id = 1001;1 row deletedSQL> select * from tableA; -- 删除一行后,总数-1 NUMOFB
----------
10000
找了一下,oracle对语句的触发不会去自动统计它影响的记录数,只好用其它方法解决了.
AFTER INSERT OR DELETE ON B
for each row
declare
begin
If inserting then
update A set NUMOFB=NUMOFB+1;
ElsIf DELETING THEN
update A set NUMOFB=NUMOFB-1;
End If;
end test;
没办法AFTER后面出发一个之前更新的东西。好像要写过程实现
AFTER INSERT OR DELETE ON TEST
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
UPDATE A SET COUNT = nvl(COUNT, 0) + 1;
ELSE
UPDATE A SET COUNT = nvl(COUNT, 0) - 1;
END IF;
END TEST_TIG;
当我insert into test values('200801',123);时
select COUNT from A的值为增1,如delete掉test表中一条记录时,A表的COUNT相应减少一条值.
值的注意的一点是,第一次insert test表时,由于没给A表中的count字段初始化为0,所以这个trigger不起作用.
只要加个nvl(count,0)就行了.