[200分]急 触发器错误!

zhangsq 2009-03-13 08:24:23
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
但触发器报错!数据什么加锁之类错误!!!
...全文
110 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
白发程序猿 2009-03-13
  • 打赏
  • 举报
回复
牛人还是多啊,才这一会就这么多答案了
yf520gn 2009-03-13
  • 打赏
  • 举报
回复

--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;
jdsnhan 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cosio 的回复:]
你这种问题我的建议根本不要在SQL 中update 来处理!
在程序端判断: 如果插入的数值是大于50,都不更新SQL
来的还更快!
[/Quote]

我同意这个观点。
触发器这玩意我一直不喜欢他,老感觉不安全
cosio 2009-03-13
  • 打赏
  • 举报
回复
你这种问题我的建议根本不要在SQL 中update 来处理!
在程序端判断: 如果插入的数值是大于50,都不更新SQL
来的还更快!
swei0319 2009-03-13
  • 打赏
  • 举报
回复
学习。
mumu_java 2009-03-13
  • 打赏
  • 举报
回复
学习了.
sleepzzzzz 2009-03-13
  • 打赏
  • 举报
回复
自治事务是可以commit的。

这个问题还是在于算法啊,哎,基础重要!!!
Allan_xd 2009-03-13
  • 打赏
  • 举报
回复
3楼的是正解
oracledbalgtu 2009-03-13
  • 打赏
  • 举报
回复
自治事务的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;
/


[Quote=引用楼主 zhangsq 的帖子:]
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…
[/Quote]
ab5669 2009-03-13
  • 打赏
  • 举报
回复
11楼 正解
sjq521521 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ckc 的回复:]
触发器里不可以commit
[/Quote]
正确
ckc 2009-03-13
  • 打赏
  • 举报
回复
触发器里不可以commit
surge0321 2009-03-13
  • 打赏
  • 举报
回复
学习
oracle13 2009-03-13
  • 打赏
  • 举报
回复
向3 楼学习
jin_ok 2009-03-13
  • 打赏
  • 举报
回复
学习了

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧