用 存储过程时 总提示 表TABLE_HR 发生了变化, 触发器/函数不能读它

灵魂火焰 2013-06-30 06:49:07
如题目所示,
定义如下:

-----更改职位的存储过程:
create or replace procedure CgPos(
pos in table_hr.position%type,
id in table_hr.worker_id%type ) is
cn number;
begin
select count(*) into cn from table_hr where worker_id=id;
if cn>0 then
if pos='hr' or pos='采购' or pos = '销售' or pos =NULL then
update table_hr set position=pos where worker_id=id; --就这一句重复调用触发器
else dbms_output.put_line('职位不对!无效执行!');
rollback;
end if;
else dbms_output.put_line('没有该ID员工!无效执行!');
rollback;
end if;
commit;
end CgPos;
/
-----更改职位的触发器 修改模块儿权利值://========================就这一块儿有问题
create or replace trigger after_CgPosition_then_CgPower
after update of position on table_hr
for each row
begin
if :old.position ='hr' then
update table_hr set powerhr=1, powerBuy=0, powerSell=0, powerScan=1 where worker_id=:new.worker_id;
elsif :old.position ='采购' then
update table_hr set powerhr=0, powerBuy=1, powerSell=0, powerScan=1 where worker_id=:new.worker_id;
elsif :old.position ='销售' then
update table_hr set powerhr=0, powerBuy=0, powerSell=1, powerScan=1 where worker_id=:new.worker_id;
elsif :old.position =NULL then
update table_hr set powerhr=0, powerBuy=0, powerSell=0, powerScan=0 where worker_id=:new.worker_id;
else dbms_output.put_line('职位不对!无效执行!');
end if;
end after_CgPosition_then_CgPower;
/

--执行:

我希望更改 position 项值的时候 触发自动更改 power*** 几项的值。不过总是提示:

ORA-04091: 表 JDKING.TABLE_HR 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "JDKING.AFTER_CGPOSITION_THEN_CGPOWER", line 4
ORA-04088: 触发器 'JDKING.AFTER_CGPOSITION_THEN_CGPOWER' 执行过程中出错
ORA-06512: 在 "JDKING.CGPOS", line 10
ORA-06512: 在 line 1

学生刚刚开始学习plsql~希望大牛们指点
...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010412956 2013-07-02
  • 打赏
  • 举报
回复
你们看的很仔细,我开始还没发现,它触发器中自己修改自己
et024 2013-07-02
  • 打赏
  • 举报
回复
引用 9 楼 zhaoxiangchong 的回复:
在你写的触发器中,触发条件和触发操作针对的是同一张表。这在oracle中,是不能用普通的触发器的,要用到instead of 类型的触发器。
是的,建议参考下9L
AUQK 2013-07-01
  • 打赏
  • 举报
回复
触发器里不能再进行修改触发器所执行的表,否则会产生表变异
善若止水 2013-07-01
  • 打赏
  • 举报
回复
在你写的触发器中,触发条件和触发操作针对的是同一张表。这在oracle中,是不能用普通的触发器的,要用到instead of 类型的触发器。
多壮志 2013-07-01
  • 打赏
  • 举报
回复
触发器中肯定是不能再写对自己的dml操作(select例外),否则就是死循环嵌套。百度下04091更快些。
现在 2013-07-01
  • 打赏
  • 举报
回复
关注学习!!好像有死锁。。
u010412956 2013-06-30
  • 打赏
  • 举报
回复
使用自治事物看看,加上 create or replace trigger after_CgPosition_then_CgPower after update of position on table_hr for each row declare pragma autonomous_transaction; begin if :old.position ='hr' then update table_hr set powerhr=1, powerBuy=0, powerSell=0, powerScan=1 where worker_id=:new.worker_id; elsif :old.position ='采购' then update table_hr set powerhr=0, powerBuy=1, powerSell=0, powerScan=1 where worker_id=:new.worker_id; elsif :old.position ='销售' then update table_hr set powerhr=0, powerBuy=0, powerSell=1, powerScan=1 where worker_id=:new.worker_id; elsif :old.position =NULL then update table_hr set powerhr=0, powerBuy=0, powerSell=0, powerScan=0 where worker_id=:new.worker_id; else dbms_output.put_line('职位不对!无效执行!'); end if; end after_CgPosition_then_CgPower; /
Regan-lin 2013-06-30
  • 打赏
  • 举报
回复
引用 3 楼 jake2658 的回复:
[quote=引用 2 楼 u011130289 的回复:] 你写好了存储难道你不知道要用的?
我是 单独调用的存储 首栏忘给了,一楼回复就是。。。 存储没问题 ,主要是 触发器老不能用。。[/quote] 建立触发器的不是create trig on 表名 然后在SQL操作,再SQL语句,你好像顺序错了···
灵魂火焰 2013-06-30
  • 打赏
  • 举报
回复
引用 2 楼 u011130289 的回复:
你写好了存储难道你不知道要用的?
我是 单独调用的存储 首栏忘给了,一楼回复就是。。。 存储没问题 ,主要是 触发器老不能用。。
Regan-lin 2013-06-30
  • 打赏
  • 举报
回复
你写好了存储难道你不知道要用的?
灵魂火焰 2013-06-30
  • 打赏
  • 举报
回复
--执行 exec CgPos('hr',1);

17,377

社区成员

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

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