免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3326 | 回复: 4
打印 上一主题 下一主题

如何取得一串连续的数字 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-24 11:13 |只看该作者 |倒序浏览
大家好:

    我有一个需求,想请教一下要如何比较快效率地实现

   ex:
   总位数:16 (最后编码的总位数)
   固定编号位数:8
    固定编号:YC052008
    流水号位数:8

    流水码起始号:user_keyin1
    流水码终止号:user_keyin2

    若用户key in的范围是 0-5,则产生YC05200800000000/YC05200800000001......./YC05200800000005
    其中,每产生一个号码,发检查后台table,此号码是否已经生成过了,若生成过了,则会记录错误log档

   目前我使用的方式,效率有点差,即:
  用循环的方式,每产生一个号码,就启用一个select语句,ex:
    while
        产生号码
     select 检查号码是否生成
   end while
     但这样的效果感觉太差了,因为若循环100万次,则要启用100万次的select,running time太长了,算是比较糟糕了
   
   我目前有想到用rownum的方式,但是弱点是,他会基于select表的行数,ex:
    SELECT '固定编号'||ROWNUM as mycol FROM table1
      WHERE ROWNUM BETWEEN user_keyin1 AND user_keyin2   
           ---目前为止生成起始编码~截止编码--ROWNUM处还要加一点format,因为编码的长度是确定的
        AND mycol NOT IN (SELECT .....FROM 后台表)
           --- NOT IN效率差一点,可能会改用not exist

     但是这里有一个致命的问题,即table1的行数要足够大才可以,因为userkeyin的数字,目前可以达到16位,
   所以我想请问一下,比较好的解决方法是怎样?

  谢谢各位

论坛徽章:
1
丑牛
日期:2014-08-07 17:07:05
2 [报告]
发表于 2008-11-24 11:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2008-11-24 12:31 |只看该作者
begin
  for no in 1 .. 10000 loop
     select 'x' from 后台表
     where ??? = no;
    if 有数据 then
       ...
       -- 这个no不能用
   else
       -- 按你要的格式输出no
   end if;
  end loop;
end;

论坛徽章:
0
4 [报告]
发表于 2008-11-24 13:24 |只看该作者
To Doni
     我原来的实现方法和您的类似,但是由于每产生一个no后,去做一次select,目前效果不太好

To ILOVEMK
     Sequence有想过,但是sequence的取得,好象都是用nextval,一条条去取得的,我不太熟他,可能说得不对

目前我在try select语句的connect by ,看是不是ok,ex
     select id+1000 from (select level as id from dual connect by level<=1000);
     看是不是work

不过好象不是标准的ANSI...哎.....,回去再try

各位还有什么好的idea,谢了

论坛徽章:
0
5 [报告]
发表于 2008-11-24 16:51 |只看该作者
目前测试结果:
数据量10万笔
step 1:用select connect by 的语句产生号码,并丢入temp table  <1秒(10万笔)
step 2:用后台表1丢入temp table1   <1秒(1329笔)
step 3:从temp table中去掉temp table1的结果 19秒
step 4:后台表2/后台表3 join的结果放至temp table3 <1秒(4000多笔中选中30笔左右)
step 5:从temp table中去掉temp table3的结果 36秒
step 6:把temp table的结果插入正式表 2秒(10万笔)

基本上效率还行,不过好象step 5,比较奇怪
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP