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
但触发器报错!数据什么加锁之类错误!!!
解决方案 »
- oralce 记录莫名其妙丢失
- 存储过程里使用Commit的时机
- ORA-01653: unable to extend table
- 有谁知道Oracle,DB2,SQL Server在代价评估模型上面的区别?
- c#调用oracle存储过程问题
- 利用JDBC查询得到ResultSet,如何获取Field信息?
- oracle8.016安装时的问题!!急~~~~~~
- 新手请教,一个关于exists的语句.高分答谢~~~
- 已经实现了应用程序不装oracle客户端连接oracle服务器,但还有个问题,大家看看。
- 初学者的问题?
- 求助:百万级数据分组排序,求时间间隔进行批量修改标志
- 刚做了一个用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;