请教一个关于游标,循环的存储过程

hhuc507 2014-11-12 05:41:16
declare
i integer; --定义变量
begin
i := 1;
loop
/* 插入数据 */

insert into t_yx_bak values('1','2');

/* 参数递增 */
i := i + 1;
/* 停止条件 */
if mod(i, 10000) = 0
then
commit;
end if;
exit when i=8000000;
end loop;
commit;
end;
这个执行完以后永远不会停止,数据也不会变多,结果是一样的,但不会停止执行,哪位大神遇到过这种情况
...全文
123 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhuc507 2014-11-13
  • 打赏
  • 举报
回复
引用 13 楼 bw555 的回复:
应该只是执行时间太长,pl/sql不响应了,应该和这个过程本身关系不大
可能是的。。。此贴终结。。。
bw555 2014-11-13
  • 打赏
  • 举报
回复
应该只是执行时间太长,pl/sql不响应了,应该和这个过程本身关系不大
sych888 2014-11-13
  • 打赏
  • 举报
回复
用FOR循环更直接明了
sych888 2014-11-13
  • 打赏
  • 举报
回复
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 11月 13 09:13:09 2014 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn scott/tiger 已连接。 SQL> desc t 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------- ID NUMBER SQL> drop table t purge; 表已删除。 SQL> create table t(id int); 表已创建。 SQL> desc t 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------- ID NUMBER(38)
hhuc507 2014-11-13
  • 打赏
  • 举报
回复
引用 7 楼 weiwangsisoftstone 的回复:
不可能出现不退出的
也不是不退出,数据到7999999就不会增加了 ,不过plsql一直处于执行状态
hhuc507 2014-11-13
  • 打赏
  • 举报
回复
引用 1 楼 u012433986 的回复:
可以停止啊,你可以把值设小的测试下。。另外 if mod(i, 10000) = 0 then commit; end if; 是要干嘛 没看懂
数据小的时候,不会出现pl/sql一直在执行状态 这种情况,就是数据量略大以后会出现,我们的数据有3000w左右吧,
hhuc507 2014-11-13
  • 打赏
  • 举报
回复
引用 1 楼 u012433986 的回复:
可以停止啊,你可以把值设小的测试下。。另外 if mod(i, 10000) = 0 then commit; end if; 是要干嘛 没看懂
这个是我要的一个功能:分批commit, 这个只是测试的demo
wangwei 2014-11-13
  • 打赏
  • 举报
回复
不可能出现不退出的
hhuc507 2014-11-13
  • 打赏
  • 举报
回复
引用 4 楼 bw555 的回复:
记混了,记得有种语言写的最大是32767,好象是vba还是啥的 刚去查了了一下文档,integer相当于number(38),但是一般不建议使用此种类型,很少会用到这么大的数 不过无法退出的原因肯定是由于不能满足条件i=8000000造成的,啥原因没想通,有些猜想不好说,一会去测试下先
数据插入没问题7999999,就是pl/sql一直处于运行状态,不会停止。。。
bw555 2014-11-13
  • 打赏
  • 举报
回复
SQL> ed
已写入 file afiedt.buf

  1  declare
  2    i integer; --定义变量
  3  begin
  4    i :=8000000-10;
  5    loop
  6      /* 插入数据 */
  7       dbms_output.put_line(i);
  8      /* 参数递增 */
  9      i := i + 1;
 10      /* 停止条件 */
 11      if mod(i, 10000) = 0
 12         then
 13        dbms_output.put_line('commit');
 14      end if;
 15      exit when i=8000000;
 16    end loop;
 17    commit;
 18* end;
SQL> /
7999990
7999991
7999992
7999993
7999994
7999995
7999996
7999997
7999998
7999999
commit

PL/SQL 过程已成功完成。

SQL>
测试了下没有你说的现象啊
bw555 2014-11-13
  • 打赏
  • 举报
回复
记混了,记得有种语言写的最大是32767,好象是vba还是啥的 刚去查了了一下文档,integer相当于number(38),但是一般不建议使用此种类型,很少会用到这么大的数 不过无法退出的原因肯定是由于不能满足条件i=8000000造成的,啥原因没想通,有些猜想不好说,一会去测试下先
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
Integer为32位,其范围为 -2^15 到 2^15-1 之间 所以最大值是 2^15-1=32767,永远也不会到达8000000这个数的 类型改为number试试
INTEGER INT A whole number in the range of (-2**31) to (2**31)-1.
bw555 2014-11-12
  • 打赏
  • 举报
回复
Integer为32位,其范围为 -2^15 到 2^15-1 之间 所以最大值是 2^15-1=32767,永远也不会到达8000000这个数的 类型改为number试试
孤单恶少 2014-11-12
  • 打赏
  • 举报
回复
可以停止啊,你可以把值设小的测试下。。另外 if mod(i, 10000) = 0 then commit; end if; 是要干嘛 没看懂

17,377

社区成员

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

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