emp表数据
empid   empname sex     age       phone          birthday      deptid
6 sadsa 女 22 13512341234 1990-3-2 3
2 李四 男 18 13536353454 1990-3-5 1
3 aa 男 30 13547457456 1988-3-9 1
4 ccc 男 20 13566576633 1980-10-29 1
5 dd 男 20 13556898569 1980-10-10 2
7 张三 男 20 135746746 1990-10-10 2通过如下触发实现当把员工的年龄修改超过50岁时触发器触发把年龄再恢复成原来的年龄
create or replace trigger updateage
  before update on emp
   for each row
     
declare
         PRAGMA  AUTONOMOUS_TRANSACTION;
     begin
      dbms_output.put_line(:new.age||'---'||:old.age||'---'||:old.empid);
      if(:new.age>50)then
        update emp set age=:old.age where empid=:old.empid;--也要修改表数据()
        commit;
      end if;
     end;但执行如下修改时
 update emp set age=58 where empid=2
但触发器报错!数据什么加锁之类错误!!!

解决方案 »

  1.   

    自治事务的trigger是可以commit的。
    出错的原因是,你在更新empid=2的记录,但是它触发了你的trigger,而你的trigger也是要更新empid=2的记录,
    所以trigger无法获取lock,所以报错。
    不过你的这个需求可以通过如下的trigger解决:
    CREATE OR REPLACE TRIGGER UPDATEAGE
      BEFORE UPDATE ON EMP
      FOR EACH ROW
    /*DECLARE
      PRAGMA AUTONOMOUS_TRANSACTION;*/
    BEGIN
      DBMS_OUTPUT.PUT_LINE(:NEW.AGE || '---' || :OLD.AGE || '---' ||
                           :OLD.EMPID);
      IF (:NEW.AGE > 50) THEN
        /*UPDATE EMP SET AGE = :OLD.AGE WHERE EMPID = :OLD.EMPID; --也要修改表数据() 
        COMMIT;*/
        :new.age:=:old.age;
      END IF;
    END;
    /
      

  2.   

    自治事务是可以commit的。这个问题还是在于算法啊,哎,基础重要!!!
      

  3.   

    你这种问题我的建议根本不要在SQL 中update 来处理!
    在程序端判断: 如果插入的数值是大于50,都不更新SQL
    来的还更快!
      

  4.   


    --TRY IT
    create or replace trigger updateage 
      before update of age on emp 
      for each row 
    when(new.age>50)
    begin 
       :new.age:=:old.age;
    end;