ITPub博客

首页 > 数据库 > Oracle > 帮忙看下这个oracle触发器,在select后面的where语句有有关问题,但不知道什么有关问题

帮忙看下这个oracle触发器,在select后面的where语句有有关问题,但不知道什么有关问题

Oracle 作者:46430408 时间:2012-04-27 15:25:28 0 删除 编辑
1.       删除DEPT_FLOW_MGR这个表的某条记录的时:

规则如下:

1)       分别获得删除记录的OWN_DEPT_ID和CUSTOMER_DEPT_ID

2)       删除FLOW_STATUS_MGR表中的OWNUSERID(提交人用户id)和CUSUSERID(被提交人用户id)对应的主部门id(MAINDEPTID)分别是OWN_DEPT_ID(提交部门id)和CUSTOMER_DEPT_ID(被提交部门id)并且ADDTYPEID=1的记录。

3)       用户和用户的主部门对应关系在sys_user表中。用户id字段为id,主部门id字段为MAINDEPTID。





CREATE OR REPLACE TRIGGER DELEDEPT_FLOW_MGR
before DELETE ON DEPT_FLOW_MGR
FOR EACH ROW
declare
cursor o_ownuserid is
select s.id as ownuserid
  from sys_user s
  where s.maindeptid = old.own_dept_id;
cursor c_cususerid is
  select m.id as cususerid
  from sys_user m
  where m.maindeptid = old.customer_dept_id;
begin
<>
for o_record in o_ownuserid loop
<>
for c_record in c_cususerid loop
delete from flow_status_mgr a
where a.ownuserid=o_record.ownuserid
and a.cususerid=c_record.cususerid
and a.addtypeid=1;
end loop inner;
end loop outer;
END;

求牛人解答
问题补充
我知道哪里错了,真汗。。。丢人
问题补充
3.       当sys_user表中的用户被注销时,即用户表的isactive字段被从1修改到0时:

规则如下:

1)       删除FLOW_STATUS_MGR中OWN_DEPT_ID或CUSTOMER_DEPT_ID等于此用户id的记录



CREATE OR REPLACE TRIGGER MODIFYSYSUSER
AFTER UPDATE OF ISAGENT ON SYS_USER
FOR EACH ROW
BEGIN
  if old.isactive =1 and new.isactive=0 then
    delete from flow_status_mgr where own_dept_id =: new.id or customer_dept_id =: new.id;
  end if;
END;

这个触发器有问题,为什么
问题补充
我知道原因了

------------------------------------------------------------------------------------------------------------------
问题补充:
小卓SUN 写道
因为你没定义 old as old row啊。。。


貌似我把if改成when 然后放到begin上面就可以用了

------------------------------------------------------------------------------------------------------------------
问题补充:
小卓SUN 写道
引用
貌似我把if改成when 然后放到begin上面就可以用了


执行语句放在begin前面?? 怎么可能啊。。。

话说我没理解你的数据库设计

如果一个user向一个客户提交了多个纪录
又如果一个user向多个客户都提交了纪录

怎么会因为删除了其中一条记录就删除user对应的department id?
那剩下的纪录对应什么???

而且你删除了整个depart, 那同部门的其他人员对应谁??

你成功的原因也许是只用1 2条记录做的测试
不论从编程规范还是逻辑设计,我都觉得有点问题哦帮忙看下这个oracle触发器,在select后面的where语句有有关问题,但不知道什么有关问题



create or replace
TRIGGER MODIFYSYSUSER
AFTER UPDATE OF ISACTIVE ON SYS_USER
FOR EACH ROW
WHEN (old.isactive=1and new.isactive=0)
BEGIN
  delete from flow_status_mgr t where t.ownuserid = :new.id or t.cususerid = :new.id;
END;

把when放在begin上面就可以了,对了,要是用if怎么用啊,怎么定义啊


------解决方案--------------------------------------------------------
因为你没定义 old as old row啊。IndexOutOfBoundsException。。

------解决方案--------------------------------------------------------
引用
貌似我把if改成when 然后放到begin上面就可以用了


执行语句放在begin前面?? 怎么可能啊。。。

话说我没理解你的数据库设计

如果一个user向一个客户提交了多个纪录
又如果一个user向多个客户都提交了纪录

怎么会因为删除了其中一条记录就删除user对应的department id?
那剩下的纪录对应什么???

而且你删除了整个depart, 那同部门的其他人员对应谁??

你成功的原因也许是只用1 2条记录做的测试
不论从编程规范还是逻辑设计,我都觉得有点问题哦帮忙看下这个oracle触发器,在select后面的where语句有有关问题,但不知道什么有关问题



------解决方案--------------------------------------------------------
引用
create or replace
TRIGGER MODIFYSYSUSER
AFTER UPDATE OF ISACTIVE ON SYS_USER
FOR EACH ROW
WHEN (old.isactive=1and new.isactive=0)
BEGIN
  delete from flow_status_mgr t where t.ownuserid = :new.id or t.cususerid = :new.id;
END;

把when放在begin上面就可以了,对了,要是用if怎么用啊,怎么定义啊

我会写成
TRIGGER MODIFYSYSUSER AFTER UPDATE OF ISACTIVE ON SYS_USER FOR EACH ROW BEGIN  IF(old.isactive = land AND new.isactive=0)  DELETE FROM ... ...END IF;END;

你的代码写的我太无语了

------解决方案--------------------------------------------------------
中间 and我写了2次 笔误请忽略
------解决方案--------------------------------------------------------
可参考:
Oracle查询语句中的select * from tb1, tb2 where tb1.id=tb2(id+)这里的(id+)起什么作用啊解决方案   http://www.myexception.cn/c-sharp/64710.html


另这里的部分程序错误异常BUG解决方案

%D%A

java环境变量设置|http://www.myexception.cn/java-other/172921.html

%D%A

oracle存储过程|http://www.myexception.cn/oracle-develop/177537.html

websphere7.0数据源配置有关问题

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22971147/viewspace-1116891/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-12-04