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.