一个简单的触发器问题,帮忙啊!

xmao 2006-03-28 01:43:25
对于同一个表t_emp_cde(人员表),我想判断,如果这个员工的部门发生改变c_dpt_cde(部门字段),我就设置其他两个字段为0,触发器我这么写的:
CREATE OR REPLACE TRIGGER TRI$_T_EMP_CDE_CHANGEDEP
BEFORE UPDATE of c_dpt_cde ON T_EMP_CDE FOR EACH ROW
DECLARE
v_emp_cde VARCHAR2(10);
BEGIN
IF UPDATING THEN
v_emp_cde := :NEW.C_EMP_CDE;
IF :NEW.C_DPT_CDE != :OLD.C_DPT_CDE THEN
UPDATE T_EMP_CDE SET NC_STATUS=0 , NC_OPR_STATUS=0
WHERE C_EMP_CDE = v_emp_cde;
END IF;
END IF;
END;
当我执行update语句时报错:
ORA-04091:表T_EMP_CDE发生了变化,触发器/函数不能读 ORA-O6512:在TRI$_T_EMP_CDE_CHANGEDEP LINE 7
我知道可能是变量取值时候发生的错,于是我把触发器作了如下更改;
CREATE OR REPLACE TRIGGER TRI$_T_EMP_CDE_CHANGEDEP
BEFORE UPDATE of c_dpt_cde ON T_EMP_CDE FOR EACH ROW
DECLARE
v_old_emp_cde VARCHAR2(10);
v_new_emp_cde VARCHAR2(10);
BEGIN
v_old_emp_cde:= :old.C_EMP_CDE;
if UPDATING THEN
v_new_emp_cde:= :new.C_EMP_CDE;
IF TRIM(v_new_emp_cde) != TRIM(v_old_emp_cde) THEN
UPDATE T_EMP_CDE SET NC_STATUS='0',NC_OPR_STATUS='0' WHERE C_EMP_CDE = TRIM(v_old_emp_cde);
END IF;
END IF;
END;

这次触发器创建成功,当我执行update语句后没有抱任何错,但我查询NC_OPR_STATUS和NC_STATUS两个字段的时候,发现值没有改变,这是什么原因呢???

在线等待,帮忙解决,十分感谢,要多少分都拿去!
...全文
177 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmao 2006-03-28
  • 打赏
  • 举报
回复
谢谢!
goldarcher2005 2006-03-28
  • 打赏
  • 举报
回复
要在触发器中修改自身表(在表a上修改a的列)用:new.anc :=???就可以了
bobfang 2006-03-28
  • 打赏
  • 举报
回复
:NEW.NC_OPR_STATUS:='0';
xmao 2006-03-28
  • 打赏
  • 举报
回复
楼上的兄弟,bobfang(匆匆过客) ( )
CREATE OR REPLACE TRIGGER TRI$_T_EMP_CDE_CHANGEDEP
BEFORE UPDATE of c_dpt_cde ON T_EMP_CDE FOR EACH ROW
DECLARE
v_emp_cde VARCHAR2(10);
BEGIN
IF UPDATING THEN
IF (:NEW.C_DPT_CDE != :OLD.C_DPT_CDE)
or(:OLD.C_DPT_CDE is null and :NEW.C_DPT_CDE is not null)
or(:OLD.C_DPT_CDE is not null and :NEW.C_DPT_CDE is null) THEN
:NEW.NC_STATUS:='0';
:NEW.NC_OPR_STATUS='0';
END IF;
END IF;
END;

你的触发器:NEW.NC_STATUS:='0';
:NEW.NC_OPR_STATUS='0';这块编译不过去,如果只写一句可以编译过去,而且是正确的,怎样把这两句连接起来?
xmao 2006-03-28
  • 打赏
  • 举报
回复
谢谢关注,还是不行,执行update语句后值还是没有改变。
我尝试把Before改称After,也不行。
bobfang 2006-03-28
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER TRI$_T_EMP_CDE_CHANGEDEP
BEFORE UPDATE of c_dpt_cde ON T_EMP_CDE FOR EACH ROW
DECLARE
v_emp_cde VARCHAR2(10);
BEGIN
IF UPDATING THEN
IF (:NEW.C_DPT_CDE != :OLD.C_DPT_CDE)
or(:OLD.C_DPT_CDE is null and :NEW.C_DPT_CDE is not null)
or(:OLD.C_DPT_CDE is not null and :NEW.C_DPT_CDE is null) THEN
:NEW.NC_STATUS:=0;
:NEW.NC_OPR_STATUS=0;
END IF;
END IF;
END;
aiur2000 2006-03-28
  • 打赏
  • 举报
回复
应该这样,值已经改变了,用new的

UPDATE T_EMP_CDE SET NC_STATUS='0',NC_OPR_STATUS='0' WHERE C_EMP_CDE = TRIM(v_new_emp_cde);

17,377

社区成员

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

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