日期:2014-05-17  浏览次数:20890 次

oracle 触发器 求教!!
对一个图书表里有仓库的id。创建一个触发器对每个仓库的数量进行求和 并把数量值放入仓库表中

------解决方案--------------------

--假设图书表是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条记录了?
现在在家呢,没法测试,应该没啥问题。