我又修改了一下:
create or replace trigger AU_I_UNIT_IS_HAVE_ACC
  after insert or delete on au_i_bank  
  for each row
declare
  rscount int;
begin
    if INSERTING THEN
       update au_i_unit set IS_HAVE_ACC='√' where unit_code=:new.unit_code;
    end if;           
    
    if DELETING THEN
       select count(*) into rscount from au_i_bank where unit_code=:old.unit_code;
       if rscount =0 then            
              update au_i_unit set IS_HAVE_ACC='X' where unit_code=:old.unit_code;
       end if;
   end if;
          
end AU_I_UNIT_IS_HAVE_ACC;
这样INSERTING可以了,但DELETING报错如何修改?

解决方案 »

  1.   

    触发器里面实现不了
    你要的功能就是当某类信息au_i_bank 不存在时,au_i_unit中IS_HAVE_ACC='X' 
    用job应该可以达到你的目的,定时监测au_i_unit中unit_code与au_i_unit中的对应不起来的
    项目,update IS_HAVE_ACC='X' 
      

  2.   

    你的问题是ORALE中的嵌套表,一般来说,在嵌套表中不能用SELECT 语句,INSERT 除外,其他语句均不能用SELECT 语句。在ORACLE文挡上有说明:建一个包,在语句几触发器中调用,取得COUNT(*)的数值,然后在行级触发其中进行处理就可以了
      

  3.   

    谢谢老狼提供思路,我这样做:create or replace package AU_I_UNIT_pack is 
      function getRsCount(unitcode varchar2)
               return int; end AU_I_UNIT_pack;
    create or replace package body AU_I_UNIT_pack is  function getRsCount(unitcode varchar2) 
               return int
               is
                 rscount int;
               begin
                    select count(*) into  rscount from au_i_bank where unit_code = unitcode;
                    return rscount;
      end getRsCount;
      
    end AU_I_UNIT_pack;
    create or replace trigger AU_I_UNIT_IS_HAVE_ACC
      after insert or delete on au_i_bank  
      for each row
    declare
      rscount int;
      unitcode varchar2(30);
    begin
        if INSERTING THEN
           update au_i_unit set IS_HAVE_ACC='√' where unit_code=:new.unit_code;
        end if;           
        
        if DELETING THEN
           unitcode:=:old.unit_code;
           rscount :=AU_I_UNIT_pack.Getrscount(unitcode);
           if rscount =0 then            
                  update au_i_unit set IS_HAVE_ACC='X' where unit_code=unitcode;
           end if;
       end if;
              
    end AU_I_UNIT_IS_HAVE_ACC;
    还是不行,错在哪?
      

  4.   

    你的目的是想在触发器中知道au_i_bank中是否有记录,改成下面的样子就行了:create or replace package AU_I_UNIT_pack is
     rscount int := 0;
    end AU_I_UNIT_pack;create or replace trigger AU_I_UNIT_IS_HAVE_ACC
      after insert or delete on au_i_bank  
      for each row
    declare
       unitcode varchar2(30);
    begin
        if INSERTING THEN
           AU_I_UNIT_pack.rscount :=AU_I_UNIT_pack.rscount + 1;
           update au_i_unit set IS_HAVE_ACC='√' where unit_code=:new.unit_code;
        end if;           
        
        if DELETING THEN
           AU_I_UNIT_pack.rscount :=AU_I_UNIT_pack.rscount - 1;
           unitcode:=:old.unit_code;
           if AU_I_UNIT_pack.rscount =0 then            
              update au_i_unit set IS_HAVE_ACC='X' where unit_code=unitcode;
           end if;
       end if;
            
    end AU_I_UNIT_IS_HAVE_ACC;
      

  5.   

    TO Lastdrop(空杯) ( ) :
    我是想知道表AU_I_BANK在UNIT_CODE字段条件时是否有数据
      

  6.   

    那你把after触发器改为before触发器试试。
      

  7.   

    建议
    Step 1: 建立表au_i_bank的一个before insert or delete 行级触发器,将insert 或delete的
     unit_code记录下来,可以使用包中的嵌套表
    Step2 : 建立表au_i_bank的一个after insert or delete 语句级触发器,对本次操作的每个unit_code查询表au_i_bank,看看是否还有记录,然后更改表au_i_unit