--假设图书表是BOOK,仓库表是STORAGE CREATE OR REPLACE TRIGGER TRIGGER_BOOK --创建一个触发器,时机:在插入或者更新或者删除FOO表中记录的时候 AFTER INSERT OR UPDATE OR DELETE ON FOO FOR EACH ROW DECLARE N_COUNT NUMBER(10); --变量,用于保存BOOK的数量 BEGIN SELECT COUNT(1) INTO N_COUNT FROM BOOK ; INSERT INTO STORAGE VALUES(N_COUNT); --插入到仓库表STORAGE表中 END;大致上修改一下了,我还以为是将图书的数量放在仓库里面去.思路是这样子的.另外,我觉着这种需求使用物化视图(实体化视图)会更好一些,个人建议.
--假设图书表是BOOK,仓库表是STORAGE,如果没有仓库表,先初始化建立个,有了的话就无所谓 --初始化仓库表 create table storage as select storage_id, count(1) as book_cnt from book group by storage_id;CREATE OR REPLACE TRIGGER TRIGGER_BOOK --创建一个触发器,时机:在插入或者更新或者删除FOO表中记录的时候 --修改机制是用的merge,原因是对于存在数据和不存在数据情况下处理不同。 AFTER INSERT OR UPDATE OR DELETE ON BOOK FOR EACH ROW DECLARE BEGIN merge into STORAGE a using (select count(1) as cnt from book where storage_id=:new.storage_id) b on (a.storage_id=b.storage_id) when matched then update set book_cnt =cnt when not matched then insert values(:new.storage_id,cnt); commit; END;1L兄弟的处理流程稍微有点问题,既然作触发器,就是每次有图书变更时都会触发,那仓库表不是有N条记录了? 现在在家呢,没法测试,应该没啥问题。
--假设图书表是BOOK,仓库表是STORAGE,如果没有仓库表,先初始化建立个,有了的话就无所谓 --初始化仓库表 create table storage as select storage_id, count(1) as book_cnt from book group by storage_id;CREATE OR REPLACE TRIGGER TRIGGER_BOOK --创建一个触发器,时机:在插入或者更新或者删除FOO表中记录的时候 --修改机制是用的merge,原因是对于存在数据和不存在数据情况下处理不同。 AFTER INSERT OR UPDATE OR DELETE ON BOOK FOR EACH ROW DECLARE BEGIN merge into STORAGE a using (select storage_id,count(1) as cnt from book where storage_id=:new.storage_id group by storage_id) b on (a.storage_id=b.storage_id) when matched then update set book_cnt =b.cnt when not matched then insert values(b.storage_id,b.cnt); commit; END;using 稍微有点问题修改了下。
--假设图书表是BOOK,仓库表是STORAGE
CREATE OR REPLACE TRIGGER TRIGGER_BOOK
--创建一个触发器,时机:在插入或者更新或者删除FOO表中记录的时候
AFTER INSERT OR UPDATE OR DELETE ON FOO
FOR EACH ROW
DECLARE
N_COUNT NUMBER(10); --变量,用于保存BOOK的数量
BEGIN
SELECT COUNT(1) INTO N_COUNT FROM BOOK ;
INSERT INTO STORAGE VALUES(N_COUNT); --插入到仓库表STORAGE表中
END;大致上修改一下了,我还以为是将图书的数量放在仓库里面去.思路是这样子的.另外,我觉着这种需求使用物化视图(实体化视图)会更好一些,个人建议.
--假设图书表是BOOK,仓库表是STORAGE,如果没有仓库表,先初始化建立个,有了的话就无所谓
--初始化仓库表
create table storage
as
select storage_id, count(1) as book_cnt from book group by storage_id;CREATE OR REPLACE TRIGGER TRIGGER_BOOK
--创建一个触发器,时机:在插入或者更新或者删除FOO表中记录的时候
--修改机制是用的merge,原因是对于存在数据和不存在数据情况下处理不同。
AFTER INSERT OR UPDATE OR DELETE ON BOOK
FOR EACH ROW
DECLARE
BEGIN
merge into STORAGE a
using (select count(1) as cnt from book where storage_id=:new.storage_id) b
on (a.storage_id=b.storage_id)
when matched then update set book_cnt =cnt
when not matched then insert values(:new.storage_id,cnt);
commit;
END;1L兄弟的处理流程稍微有点问题,既然作触发器,就是每次有图书变更时都会触发,那仓库表不是有N条记录了?
现在在家呢,没法测试,应该没啥问题。
--初始化仓库表
create table storage
as
select storage_id, count(1) as book_cnt from book group by storage_id;CREATE OR REPLACE TRIGGER TRIGGER_BOOK
--创建一个触发器,时机:在插入或者更新或者删除FOO表中记录的时候
--修改机制是用的merge,原因是对于存在数据和不存在数据情况下处理不同。
AFTER INSERT OR UPDATE OR DELETE ON BOOK
FOR EACH ROW
DECLARE
BEGIN
merge into STORAGE a
using (select storage_id,count(1) as cnt from book
where storage_id=:new.storage_id group by storage_id) b
on (a.storage_id=b.storage_id)
when matched then update set book_cnt =b.cnt
when not matched then insert values(b.storage_id,b.cnt);
commit;
END;using 稍微有点问题修改了下。