一个关于oralce存储过程的问题,增长见识!请帮忙看下!

Josir 2009-03-28 02:16:43
现在有这么个存储过程如下:

create or replace procedure pr_quickImport(p1 varchar2,p2 varchar2,p3 varchar2,p4 varchar2) is
--快速同步薪资档案人员至考勤中来
begin
--先删除考勤表中该月那些不存于薪资档案人员库中的人,换句话说就是如果某个人存在于薪资档案人员库中,那么就不删他了.
delete from xh_data where concat(year,period) = (p1+p2) and pk_psndoc in( select pk_psndoc from bd_psndoc where pk_deptdoc in
(select distinct power.resource_data_id from sm_power_deptdoc power, sm_user u, sm_user_role urole where u.cuserid = p3 and u.cuserid = urole.cuserid and urole.pk_corp = p4 and urole.pk_role = power.pk_role and power.orgtypecode = 1 and ( power.pk_org = p4 or iscommon_power in ( 'y', 'Y' ) ))
);

--插入薪资档案人员库中新增加的人
insert into xh_data(pk_psndoc,year,period)
select distinct psnid,cyear,cperiod
from wa_psn
where istopflag=0
and dr=0
and cyear=p1
and cperiod=p2
and classid in (select pk_wa_class from wa_waclass where vwaclassname='工资')
and psnid in (select pk_psndoc from bd_psndoc where psnclscope='0' and pk_deptdoc in (select distinct power.resource_data_id from sm_power_deptdoc power, sm_user u, sm_user_role urole where u.cuserid = p3 and u.cuserid = urole.cuserid and urole.pk_corp = p4 and urole.pk_role = power.pk_role and power.orgtypecode = 1 and ( power.pk_org = p4 or iscommon_power in ( 'y', 'Y' ) )
) ) and psnid not in (select pk_psndoc from xh_data where concat(year,period) = (p1+p2));
end pr_quickImport;

说明:
该存储过程中的sql语句都是正确取数的(单独使用)
存储过程功能说明:
该村粗过程是从一些表里取数然后插入到另一个表中,每次调用都是先按照输入的日期把该日期条件下的数据先从xh_data 中删除,然后再把该日期下的新数据插入到xh_data中。
问题:
我在调用该存储过程时,第一步delete语句没有执行,而是直接执行了 insert语句,这个问题是从前台界面上的显示情况分析出来的,因为在规定的一个日期下没条数据都多了一条重复的。请问各位有谁知道是什么问题,该怎么解决,只用让存储过程按照先delete 后insert的方式就会是正确的结果??
...全文
94 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
randy_ideal 2009-03-28
  • 打赏
  • 举报
回复
应该是delete时的where条件不成立,楼主可以把 where后的条件写在select count(*) from ..后,看是否有数据
yf520gn 2009-03-28
  • 打赏
  • 举报
回复
COMMIT~
Megan2008 2009-03-28
  • 打赏
  • 举报
回复
怎么都没有commit呢?
rockywu 2009-03-28
  • 打赏
  • 举报
回复
第一步delete语句没有执行.
delete from xh_data where concat(year,period) = (p1+p2) and pk_psndoc in( select pk_psndoc from bd_psndoc where pk_deptdoc in
(select distinct power.resource_data_id from sm_power_deptdoc power, sm_user u, sm_user_role urole where u.cuserid = p3 and u.cuserid = urole.cuserid and urole.pk_corp = p4 and urole.pk_role = power.pk_role and power.orgtypecode = 1 and ( power.pk_org = p4 or iscommon_power in ( 'y', 'Y' ) ))
);
你的where 条件成立了吗?是不是没有数据呢...可以分析一下你的where 语句测试
superhsj 2009-03-28
  • 打赏
  • 举报
回复
单独执行delelte那段看看该删的是不是删掉了

17,377

社区成员

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

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