在触发器中不能对本表再进行操作,包括查询和DML操作,你用一个最简单的也是不行的!可能需要用其它的方法来解决了!

解决方案 »

  1.   

    什么叫变异表,那为什么以下这个触发器可以了?
    CREATE OR REPLACE TRIGGER USERNAME.TABLE_NAME AFTER
    INSERT ON USERNAME.TABLE_NAME  BEGIN 
    update TABLE_NAME set yy=replace(yy,'\','/'  where rowid=(select max(rowid) from TABLE_NAME);
    END;
    这个触发器是在表TABLE_NAME里插入“89\78”后,把值改为“89/78”
      

  2.   

    触发器体中的 SQL 语句不能进行下列操作:
          读或修改触发语句的任何变异表,其中包括触发表本身。
          读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。除此之外的其他列可以修改。注意,是行触发器对变异表操作存在这两个限制,你下面这个是语句级的
      

  3.   

    一般可以用行触发器来记录数据;而用语句触发器来触发更新、删除或增加。
    因此需要两个触发过程。
    下面是实现的例子:
    ////////////////////////
    包create or replace package pck_scoscottzcntestsen as
      type tab_num is table of number
        index by binary_integer;
      type tab_class is table of varchar2(10)
        index by binary_integer;
      v_num tab_num;
      v_class tab_class;
      v_count number :=0;
    end;//////////
    行级create or replace trigger trg_scoscottzcntestsen1
       before  update on scott.zcn
       for each row
     begin
       pck_scoscottzcntestsen.v_count := pck_scoscottzcntestsen.v_count + 1;
       pck_scoscottzcntestsen.v_num(pck_scoscottzcntestsen.v_count) := :new.num;
       pck_scoscottzcntestsen.v_class(pck_scoscottzcntestsen.v_count) := :new.class;   
     end ;
    ///////////////////////////////////////////////////////////////////
    ////语句级
    create or replace trigger trg_scoscottzcntestsen2
       after update of name on scott.zcn
     declare
       v_maxnum constant number :=5;
       v_curnum number :=0;
       v_num number;
       v_class varchar2(10);
     begin
       for icount in 1.. pck_scoscottzcntestsen.v_count loop
         v_class := pck_scoscottzcntestsen.v_class(icount);
         select count(1) into v_curnum
         from scott.zcn a
         where a.class = v_class;
         if v_curnum > v_maxnum then
           raise_application_error(-20000,v_class || 'scott:sen当前人数已满!asdfasdf');
         end if;  
       end loop;
       pck_scoscottzcntestsen.v_count := 0; 
     end ;
      

  4.   

    谢谢 飞鱼 大侠,说了很对,但我还是有点不明白, 为什么在“语句级”里,用
    DELARE 
    TEST_ROW TABLENAME%ROWTYPE;
    BEGIN
    SELECT * INTO  TEST_ROW FROM TABLENAME WHERE ROWID=(SELECT MAX(ROWID) FROM TABLENAME)
    END;
    还是不可以用,说是读不到数据。请教能否推荐一书关于触发器的书,我找了好长时间都找不到一个讲触发器的讲了很细的书,看见飞鱼大侠有这样的功力,真是佩服不已呀。
      

  5.   

    还有一个问题就是在“语句级”里我定义查出了INSERT进去的一个时间类型的值(RQ),然后我想查找前一天的数据,我用“SELECT * FROM TABLENAME WHERE RQ=RQ-1” RQ是关键字。为什么报错就是未找到数据^_^_^_^_^_^_^_^_^_^_^_^
      

  6.   

    SELECT * FROM TABLENAME WHERE TO_CHAR(RQ,'YYYYMMDD')=TO_CHAR(VAR-1,'YYYYMMDD');