使用触发器更新状态
主表:id    status
       1      注销
从表:id    status   rid
       1      注销    1
       2      注销    1
       3      注销    1
       4      注销    1
       5      注销    1当从表里有一个正常的,主表状态为正常,从表全为注销时,主表为注销,我想根据从表的状态来更新,但总是提示触发器错误  IF :NEW.D401_10 = '注销' THEN
    --统计从表的所有记录
    SELECT COUNT(id)
      INTO V_MEMBER_COUNT
      FROM 从表
     WHERE rid = :OLD.id;
    --统计从表状态为 注销的记录
    SELECT COUNT(id)
      INTO V_TEMP_COUNT
      FROM 从表
     WHERE id = :OLD.rid
       AND rid = '注销';
    --当从表引用主表的记录个数全为注销时,主表更新为注销
    IF V_MEMBER_COUNT = V_TEMP_COUNT THEN
      UPDATE D301_DS_NEXT A SET D301_20 = '注销' WHERE D301_02 = :OLD.D401_00;
    END IF;
  END IF;

解决方案 »

  1.   

    典型的变异表问题啊! 一看就知道你对你触发表D301_DS_NEXT进行了update 
    oracle 规定after 触发器是不能update触发表的 
      

  2.   

    你可能是对你从表创建的after触发器,这样在触发体中是不能再select从表的
    将你after改为before是试试
    create or replace trigger trigger_name
    before insert on 从表
    for each row
    begin
    ....
    ....
    end;
      

  3.   


    +1
      IF :NEW.D401_10 = '注销' THEN
        --统计从表状态不为注销的记录
        SELECT COUNT(id)
          INTO V_TEMP_COUNT
          FROM 从表
         WHERE id = :OLD.rid
           AND rid <> '注销';
        --当从表引用主表的记录个数全为注销时,主表更新为注销
        IF V_TEMP_COUNT = 0 THEN
          UPDATE D301_DS_NEXT A SET D301_20 = '注销' WHERE D301_02 = :OLD.D401_00;
        END IF;
      END IF;