表结构:表一(从表):车牌号   业务ID  应交金额   实交金额  交款日期   修改日期
表二(主表):车牌号   车主   车辆型号ID  应收合计  实收合计要求:
在插入或修该表一时触发,动作:
1。如果是插入操作,把表 一交款日期置为当前日期
2。如果是修改操作,把表一修改日期置为当前日期
3。插入或修改表一时,计算改车牌号的应收合计和实收合计,并修改表二相应
字段值。另外,为了正确计算应收合计和实收合计,该触发器是不是应该在插入或修改后触发而不是之前?

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER TRG_TT
    AFTER INSERT OR DELETE OR UPDATE ON 表一
    FOR EACH ROW
    BEGIN
    IF INSERTING THEN
    :NEW.交款日期 :=SYSDATE;

    --增加数值: 原值 + 新增部分
    UPDATE 表二 SET 应收合计=应收合计+:NEW.应交金额,实收合计=实收合计+:NEW.实交金额 WHERE 车牌号=:OLD.车牌号;
    END IF; IF UPDATING THEN
    :NEW.修改日期 :=SYSDATE;
    --更新数值:原值 + 变动部分
    UPDATE 表二 SET 应收合计=应收合计+(:OLD.应交金额-:NEW.应交金额),
    实收合计=实收合计+(:OLD.实交金额-:NEW.实交金额)
    WHERE 车牌号=:OLD.车牌号;
    END IF;

    IF DELETING THEN
    --减少数值: 原值 - 减少部分
    UPDATE 表二 SET 应收合计=应收合计-:OLD.应交金额,实收合计=实收合计-:OLD.实交金额 WHERE 车牌号=:OLD.车牌号;
    END IF;
    END;
    /
      

  2.   

    很明显,你的表结构设计的就有问题,建议如下:表一(从表):车牌号   业务ID  应交金额   实交金额  交款日期(DEFAULT SYSDATE)   修改日期
    表二(主表):车牌号   车主   车辆型号IDCREATE OR REPLACE VIEW V_表二 AS
    SELECT A.车牌号,A.车主,A.车辆型号ID,
    SUM(B.应交金额) AS 应收合计,
    SUM(B.实交金额) AS 实收合计
    FROM 表二 A,表一 B
    WHERE A.车牌号=B.车牌号
    GROUP BY A.车牌号,A.车主,A.车辆型号ID
    /这样就只需要一个很简单的触发器来维护修改日期字段:CREATE OR REPLACE TRIGGER TRG_TT
    BEFORE UPDATE ON 表一
    FOR EACH ROW
    BEGIN
    :NEW.修改日期 :=SYSDATE;
    END;
    /甚至可以考虑在应用中直接写入修改日期,这样连触发器都不需要了