oracle中我想創建trigger來實現:
在修改t_brod表的chk_id列時,判斷表中是否還有chk_id列的值為'N'的數據,如果有,將另一個表t_brom的chk_id列的值設為'N',否則設為'Y' 
create or replace trigger aa
  after update of chk_id on t_brod
  for each row
declare 
   tcount integer;
begin
     select count(*) into tcount from t_brod where chk_id = 'N';
     if tcount = 0 then
        update t_brom set chk_id = 'Y' where bro_id = :old.bro_id;
     else
         update t_brom set chk_id = 'N' where bro_id = :old.bro_id;
     end if;
end TRI_T_BROD_INSERT;

解决方案 »

  1.   

    我這個trigger能成功創建,可是當被觸發時卻老報錯誤,說程序正在執行,無法檢索數據!
    請問高手這是什么原因?
      

  2.   

    把for each row去掉create or replace trigger aa
      after update of chk_id on t_brod
    declare 
       tcount integer;
    begin
         select count(*) into tcount from t_brod where chk_id = 'N';
         if tcount = 0 then
            update t_brom set chk_id = 'Y' where bro_id = :old.bro_id;
         else
             update t_brom set chk_id = 'N' where bro_id = :old.bro_id;
         end if;
    end TRI_T_BROD_INSERT;
      

  3.   

    oracle好像没有这个错误,是不是你自己的应用报错?
      

  4.   

    如果有一些经典的trigger使用案例,那就非常感谢啦!
      

  5.   

    更改成为下面这样.create or replace trigger aa
      BEFORE update of chk_id on t_brod
      for each row
    declare 
       tcount integer;
    begin
         select count(*) into tcount from t_brod where chk_id = 'N';
         if tcount = 0 AND :NEW.CHK_ID ='N' then
            update t_brom set chk_id = 'Y' where bro_id = :old.bro_id;
         else
             update t_brom set chk_id = 'N' where bro_id = :old.bro_id;
         end if;
    end TRI_T_BROD_INSERT;
      

  6.   

    for each row为行级触发器,更新一行,执行一次。
    如果不加则为语句级触发器,语句执行一次,触发一次。
    应该是这句where bro_id = :old.bro_id;
    有问题。
      

  7.   

    变异表的问题。http://blog.oracle.com.cn/html/58/t-120858.html