为何用游标无法取到全部记录

sbaiss 2012-11-06 07:37:21
tmp_ldl_sp表中有300多条记录,但用这个游标,每次也只能取到70条左右,哪位能帮忙看一下,不胜感激!


create or replace procedure P_VAC_SP_INSERT is
V_attr_id attr.attr_id%TYPE;
V_attr_value_id attr_value.attr_value_id%TYPE;
v_Errorcode Varchar2(20);
v_Errormsg Varchar2(1024);
i_Step Number;

CURSOR C_sp_code IS
SELECT party_id
FROM tmp_ldl_sp a
GROUP BY a.party_id;

begin

i_Step:=0;
dbms_output.put_line('begin');

SELECT a.attr_id
INTO V_attr_id
FROM attr a
WHERE a.attr_name LIKE '%SP Code%';

OPEN C_sp_code;
i_Step:=1;
FETCH C_sp_code INTO V_attr_value_id;
WHILE C_sp_code%FOUND LOOP

FETCH C_sp_code INTO V_attr_value_id;
dbms_output.put_line('V_attr_value_id=' || V_attr_value_id);
DBMS_OUTPUT.PUT_LINE('记录数:'|| C_sp_code %ROWCOUNT);
END LOOP;

CLOSE C_sp_code;

EXCEPTION
When Others Then
v_Errorcode := Sqlcode;
v_Errormsg := Sqlerrm;
Insert Into P_VAC_SP_INSERT_log
Values
(V_attr_value_id, i_Step, v_Errorcode, v_Errormsg, Sysdate);
Commit;

end P_VAC_SP_INSERT;
...全文
144 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
adura 2012-11-07
  • 打赏
  • 举报
回复
sbaiss 2012-11-07
  • 打赏
  • 举报
回复
引用 7 楼 taiguang 的回复:
引用 6 楼 sbaiss 的回复:引用 5 楼 taiguang 的回复: 引用 4 楼 sbaiss 的回复:引用 3 楼 taiguang 的回复: 引用 2 楼 BenChiM888 的回复:SQL code CURSOR C_sp_code IS SELECT party_id FROM tmp_ldl_sp a GRO……
原因找到了,是我的plsql命令行缓冲区太小了,没有全部显示出来。 set serverout on size 20000后即可全部显示。 非常感谢各位的解答!结贴给分!
软件钢琴师 2012-11-07
  • 打赏
  • 举报
回复
引用 6 楼 sbaiss 的回复:
引用 5 楼 taiguang 的回复: 引用 4 楼 sbaiss 的回复:引用 3 楼 taiguang 的回复: 引用 2 楼 BenChiM888 的回复:SQL code CURSOR C_sp_code IS SELECT party_id FROM tmp_ldl_sp a GROUP BY a.party_id; --group by了就把……
你确定查询结果都是 60条? 那重复的 不算么? 如果有重复的party_id,结果一定多于60条
sbaiss 2012-11-07
  • 打赏
  • 举报
回复
引用 5 楼 taiguang 的回复:
引用 4 楼 sbaiss 的回复:引用 3 楼 taiguang 的回复: 引用 2 楼 BenChiM888 的回复:SQL code CURSOR C_sp_code IS SELECT party_id FROM tmp_ldl_sp a GROUP BY a.party_id; --group by了就把重复的剃掉了,你去……
结果都是打印出了60条记录,区别就是不加group by,打印的值会有重复。
软件钢琴师 2012-11-07
  • 打赏
  • 举报
回复
引用 4 楼 sbaiss 的回复:
引用 3 楼 taiguang 的回复: 引用 2 楼 BenChiM888 的回复:SQL code CURSOR C_sp_code IS SELECT party_id FROM tmp_ldl_sp a GROUP BY a.party_id; --group by了就把重复的剃掉了,你去掉group by 应该就和表记录数一样了。 …… 去……
你先试一试 SELECT party_id FROM tmp_ldl_sp a GROUP BY a.party_id; 与 SELECT party_id FROM tmp_ldl_sp a ; 结果有什么区别
sbaiss 2012-11-07
  • 打赏
  • 举报
回复
引用 3 楼 taiguang 的回复:
引用 2 楼 BenChiM888 的回复:SQL code CURSOR C_sp_code IS SELECT party_id FROM tmp_ldl_sp a GROUP BY a.party_id; --group by了就把重复的剃掉了,你去掉group by 应该就和表记录数一样了。 ……
去掉gruop by 结果还是一样,打印出来的记录只有60条。 而且我游标执行完又加了条打印,可是没打印出来,会不会是游标没执行完呢? CLOSE C_sp_code; dbms_output.put_line('cursor end');
软件钢琴师 2012-11-07
  • 打赏
  • 举报
回复
引用 2 楼 BenChiM888 的回复:
SQL code 12345678 CURSOR C_sp_code IS SELECT party_id FROM tmp_ldl_sp a GROUP BY a.party_id; --group by了就把重复的剃掉了,你去掉group by 应该就和表记录数一样了。
在实际的应用中是要用GROUP BY a.party_id;的这样可以减少循环次数,但是楼主这么只是查看记录数没有太大的意义
BenChiM888 2012-11-07
  • 打赏
  • 举报
回复
  
CURSOR C_sp_code IS
    SELECT party_id
      FROM tmp_ldl_sp a
   GROUP BY a.party_id;
--group by了就把重复的剃掉了,你去掉group by 应该就和表记录数一样了。


软件钢琴师 2012-11-07
  • 打赏
  • 举报
回复
你确定 字段party_id 在表tmp_ldl_sp 中 不重复?

1,618

社区成员

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

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