LoveUnix » DB2 & Informix » 大哥们帮小弟看看这个存储过程,急!
让LU留住您的每

一天 让LU博客留住您的每一天
2007-12-19 10:42 xff-7
大哥们帮小弟看看这个存储过程,急!

存储过程产生随即字符串
第一次产生10000个随机字符串,但是第二次再产生10000个随机字符串竟然和第一次的10000个一模一样,百思不得其解 !望哪位高人指点一下。代码如下:

CREATE PROCEDURE "ISMCDB"."PRODUCE_BS"
(IN "HEAD_BS" VARCHAR(8),
  OUT "V_BS" VARCHAR(16)
)
  SPECIFIC "ISMCDB"."SQL071217125401074"
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
  BEGIN

declare v_tail_bs varchar(8);
declare random varchar(100);
declare v_count integer default 6;  
declare v_for_count integer default 0;
declare v_random_count integer;
declare v_year varchar(2);

set v_year=substr(ora.to_char(current timestamp,'yyyy'),3,2);
set v_tail_bs=v_year;
set random='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

LOOP_LABEL:  
LOOP
IF v_for_count=v_count THEN
LEAVE LOOP_LABEL;
END IF;

select floor(rand()*62) into v_random_count from langinfo;
IF v_random_count>0 THEN
set v_tail_bs=v_tail_bs||substr(random,v_random_count,1);
set v_for_count=v_for_count+1;
END IF;

IF v_for_count<v_count THEN
ITERATE LOOP_LABEL;
commit;
END IF;

END LOOP LOOP_LABEL;

set v_bs=head_bs||v_tail_bs;

end;

2007-12-20 10:41 beginner-bj
看不出什么问题。只是感觉floor(rand()*62)应换成 int(floor(rand()*62)) 。

2007-12-20 11:52 xff-7
是不是和DB2服务器的操作系统有关系?目前是装在WINDOWS下的。

2007-12-20 12:37 beginner-bj
我的机器上很正常。也是WINDOWS。
db2 => CALL "ISMCDB"."PRODUCE_BS" ('SS',?)@

  输出参数的值
  --------------------------
  参数名: V_BS
  参数值: SS07aNzskS

  返回状态 = 0

db2 => CALL "ISMCDB"."PRODUCE_BS" ('SS',?)@

  输出参数的值
  --------------------------
  参数名: V_BS
  参数值: SS07OJ9QHu

  返回状态 = 0

db2 => CALL "ISMCDB"."PRODUCE_BS" ('SS',?)@

  输出参数的值
  --------------------------
  参数名: V_BS
  参数值: SS07h4l89Y

  返回状态 = 0

db2 => CALL "ISMCDB"."PRODUCE_BS" ('SS',?)@

  输出参数的值
  --------------------------
  参数名: V_BS
  参数值: SS07q6mvyA

  返回状态 = 0

db2 =>

2007-12-20 18:24 xff-7
楼上的大哥,你打开3-5个SQL窗口,都执行select floor(rand()*62) into v_random_count from sysibm.sysdummy1,依次执行每个窗口的语句。我的执行的结果:
第一次执行5个窗口的语句,结果全为0;
第二次执行5个窗口的语句,结果全为34;
第三次执行5个窗口的语句,结果全为11;
。。。。
郁闷中。。。

2007-12-20 21:24 beginner-bj
也许rand()跟时间点有关系吧?

2007-12-21 14:48 fck
我单独执行了好几遍,都不一样啊?(windows)
db2 =>  select float(rand()*62) from sysibm.sysdummy1

1
------------------------
  +5.32544938505203E+001

  1 条记录已选择。

db2 =>  select float(rand()*62) from sysibm.sysdummy1

1
------------------------
  +4.40510879848628E+001

  1 条记录已选择。

db2 =>  select float(rand()*62) from sysibm.sysdummy1

1
------------------------
  +3.18391674550615E+001

  1 条记录已选择。

2007-12-21 18:53 beginner-bj
楼主的意思好象是:五个窗口同时执行,同一时间五个窗口的rand()是一样的。

2007-12-23 18:25 fck
怎样做到同时在5个窗口执行?
我看楼主似乎是按照顺序来执行的,然后每一次的结果5个窗口都一样。

2007-12-25 15:25 xff-7
[attach]27877[/attach]

如图中所示,在Quest中打开四个窗口。一轮一轮的执行四个窗口,每轮查询的随机结果是一样的。

2007-12-26 14:42 fck
每一轮是四个窗口同时执行吗?

2007-12-26 16:50 beginner-bj
这种问题还是打800吧

2007-12-27 22:48 xff-7
我们用的是8.2,800是个补丁包么?

2007-12-27 23:51 beginner-bj
800是电话啊。IBM的是8008101818。

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.