注册 登录
编程论坛 PowerBuilder

游标执行了第一条记录为什么就停了呢???

yzxsl 发布于 2006-04-30 17:53, 1283 次点击

DECLARE cs_emp CURSOR FOR
SELECT emp_code FROM t_emp where dept_code like :ls_find_dept and leave_flag="N" order by emp_code;
open cs_emp;
if sqlca.sqlcode < 0 then
Messagebox("Êý¾Ý¿â´í","ÓαêÎÞ·¨Ö´ÐÐ!" + sqlca.sqlerrtext)
return sqlca.sqlcode
end if

fetch cs_emp into :ls_emp_code;
do while sqlca.sqlcode = 0 //°´²¿ÃÅÄÚµÄÔ±¹¤
Delete from t_leave where emp_code = :ls_emp_code and datediff(day,startdate,:ld_date_start) <=0 and datediff(day,startdate,:ld_date_end) >=0 ;

For li_2 = 0 To DaysAfter(ld_date_start,ld_date_end)
is_cur_date = RelativeDate(ld_date_start,li_2)

if is_cur_date = ld_date_start then // µÚÒ»Ìì
wf_get_leavehour()

insert into t_leave(emp_code,startdate,enddate,startime,endtime,leave_type,reason,leave_day,leave_hour)
values(:ls_emp_code,:is_cur_date,:is_cur_date,:ls_startime,'1730',:ls_leavetype,:ls_reason,:ide_days2,:ide_hours2);
commit;
elseif is_cur_date = ld_date_end then //×îºóÒ»Ìì
wf_get_leaveend()

insert into t_leave(emp_code,startdate,enddate,startime,endtime,leave_type,reason,leave_day,leave_hour)
values(:ls_emp_code,:is_cur_date,:is_cur_date,'0800',:ls_endtime,:ls_leavetype,:ls_reason,:ide_days1,:ide_hours1);
commit;
else //ÖмäµÄ

insert into t_leave(emp_code,startdate,enddate,startime,endtime,leave_type,reason,leave_day,leave_hour)
values(:ls_emp_code,:is_cur_date,:is_cur_date,'0800','1730',:ls_leavetype,:ls_reason,'1','8');
commit;
end if
next
fetch cs_emp into :ls_emp_code;

loop
close cs_emp;

5 回复
#2
yzxsl2006-04-30 17:55
就是说,如果一个游标有几条记录,当有标执行后,运行第一条记录到下面的fetch语句后,就跳出来了,不会继续将剩下的内容执行完,为什么呢????
#3
i75212006-05-09 08:51
我也遇到过类似问题,我试过将提交语句移出循环就没事了,可能是提交时出的错,具体原因就不太清楚了。
#4
wsl0002006-05-09 09:56
fetch cs_emp into :ls_emp_code;
应该放在循环语句里
#5
chinesesoft2006-05-13 09:02
检查一下在insert 之前每个变量的值或数据类型和你的table是否一致,在commit之前show 一下你的sqlca.sqlcode 的值。很容易就可以查出问题了,这种情况以前也碰到。
#6
hsjljh2006-05-14 11:37
1