★ 高分求解:触发器问题. ★

sydt2000 2003-03-03 05:21:52
创建触发器:
CREATE OR REPLACE TRIGGER bearing_state_update_trig
AFTER UPDATE OF state ON res_bearing
REFERENCING NEW AS new_res_bearing OLD AS old_res_bearing
FOR EACH ROW

BEGIN

IF ( :new_res_bearing.state = 99 ) THEN -- 轴承报废
UPDATE res_bearing
SET res_bearing.state = 99,
res_bearing.scrap_date = sysdate
WHERE res_bearing.bearing_id = :new_res_bearing.bearing_id;
END IF;

END;
/
触发器已创建。

UPDATE res_bearing SET state=99 where bearing_id='121-002';

执行SQL语句报错如下!
ORA-04091: 表 SYSTEM.RES_BEARING ·发生变化触发器/函数不能读。
ORA-06512: 在"SYSTEM.BEARING_STATE_UPDATE_TRIG", line 4
ORA-04088: 触发器 'SYSTEM.BEARING_STATE_UPDATE_TRIG' 执行过程中出错
解决马上结帖!
...全文
36 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sydt2000 2003-03-04
  • 打赏
  • 举报
回复
多谢各位!
结贴!
sydt2000 2003-03-04
  • 打赏
  • 举报
回复
To: txchinali(小虫)
多谢!
txchinali 2003-03-03
  • 打赏
  • 举报
回复
AFTER UPDATE OF state 是在update后进行触发器操作
BEFORE UPDATE OF state 是在before之前进行触发器操作

主要取觉于用于在update前操作还是update后操作
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
To: Lastdrop(空杯)
多谢!
Lastdrop 2003-03-03
  • 打赏
  • 举报
回复
AFTER UPDATE OF state 改为BEFORE UPDATE OF state
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
To: beckhambobo(beckham)
去掉此句:new_res_bearing.state := 99;
ORA-04084: 无法更改此触发器类型的NEW值
还是出现上述错误!


beckhambobo 2003-03-03
  • 打赏
  • 举报
回复
sorry,去掉此句
:new_res_bearing.state := 99;
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
To: beckhambobo(beckham)
ORA-04084: 无法更改此触发器类型的NEW值
出现上述错误!

beckhambobo 2003-03-03
  • 打赏
  • 举报
回复
去掉后,任何一列被更新时都会触发该触发器.
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
To: beckhambobo(beckham)
CREATE OR REPLACE TRIGGER bearing_state_update_trig
AFTER UPDATE OF state ON res_bearing -- 只在state字段发生改变时触发,为什么
-- 去掉OF state ??
REFERENCING NEW AS new_res_bearing OLD AS old_res_bearing
FOR EACH ROW
...
拜托解释一下?
beckhambobo 2003-03-03
  • 打赏
  • 举报
回复
before UPDATE OF state ON res_bearing
修改为:
before UPDATE ON res_bearing
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
IF ( :new_res_bearing.state = 99 ) THEN -- 轴承报废
:new_res_bearing.state := 99;
:new_res_bearing.scrap_date := sysdate;

END IF;
ORA-04084: 无法更改此触发器类型的NEW值
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
ORA-04084: 无法更改次触发器类型的NEW值
vongates968 2003-03-03
  • 打赏
  • 举报
回复
up
beckhambobo 2003-03-03
  • 打赏
  • 举报
回复
不用了,:new记录更新当前数据,具体到那条数据,触发器会做的,不用再次判定.
sydt2000 2003-03-03
  • 打赏
  • 举报
回复
二位大虾!
小弟菜!
在触发器中不需进行条件判断么?bearing_id字段为表的主关键字?
能否帮解释一下?
beckhambobo 2003-03-03
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER bearing_state_update_trig
before UPDATE OF state ON res_bearing
REFERENCING NEW AS new_res_bearing OLD AS old_res_bearing
FOR EACH ROW

BEGIN

IF ( :new_res_bearing.state = 99 ) THEN -- 轴承报废
:new_res_bearing.state:= 99;
:new_res_bearing.scrap_date := sysdate;

END IF;

END;
/
bobfang 2003-03-03
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER bearing_state_update_trig
before UPDATE OF state ON res_bearing
REFERENCING NEW AS new_res_bearing OLD AS old_res_bearing
FOR EACH ROW

BEGIN

IF ( :new_res_bearing.state = 99 ) THEN -- 轴承报废
:new_res_bearing.scrap_date := sysdate;
END IF;

END;
/

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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