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
但触发器报错!数据什么加锁之类错误!!!
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
但触发器报错!数据什么加锁之类错误!!!
解决方案 »
- oracle关于不同表空间名的导数据
- A、B两个字段,哪个存在就取哪个,都存在取A,用什么函数
- 昨天的数据库面试题,请高手指点。
- ora-00942报错 请高手看一下,急在线等
- 如何通过 dbms_job 生成 “每周 2,3,4,5,6 凌晨 1~4点,每半小时执行 SP:test_SP ”的任务 ?
- 急啊,Oracle监听程序启动不了
- 100分求Oracle9i Application Server安装问题!
- oracle 9i备份出错
- 为什么用JDBC访问oracle时说找不到packet oracle.jdnbc.*
- ora--00314 日志n要求的序号XX与XX不匹配
- 求助:百万级数据分组排序,求时间间隔进行批量修改标志
- 刚做了一个用JDBC把ORACLE数据转移到SYBASE的小程序,想和大家分享。有意者可以发邮件给我!呵呵!
出错的原因是,你在更新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;
/
在程序端判断: 如果插入的数值是大于50,都不更新SQL
来的还更快!
--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;