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

解决方案 »

  1.   


    --假设图书表是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;大致上修改一下了,我还以为是将图书的数量放在仓库里面去.思路是这样子的.另外,我觉着这种需求使用物化视图(实体化视图)会更好一些,个人建议.
      

  2.   


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

  3.   

    --假设图书表是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 稍微有点问题修改了下。