请帮我看一下这个PL/SQL 程序的问题所在,在线等

[复制链接]
查看11 | 回复8 | 2007-7-4 17:27:50 | 显示全部楼层 |阅读模式
create or replace package body TEST01_PKG is
-- Function and procedure implementations
function random_char(p_length in number default 10,

p_include_char in boolean default false)
return varchar2 is
v_string varchar2(20);
v_tempstring varchar2(20);
v_temp number(2);
begin
FOR i in 1 .. p_length LOOP
IF p_include_char THEN
v_temp := Dbms_Random.value(48, 57);
v_tempstring := CHR(v_temp);

ELSE

LOOP

v_temp := DBMS_RANDOM.value(48, 90);

EXIT WHEN(v_temp64);

v_tempstring := CHR(v_temp);

DBMS_OUTPUT.put_line(v_tempstring);
END LOOP;
END IF;
v_string := v_string || v_tempstring; --Append character to string
DBMS_OUTPUT.put_line(v_string);

END LOOP;
return v_string;
end random_char;
end TEST01_PKG;
test的时候它老是停在FOR i in 1 .. p_length LOOP这里,不知道为什么,高手指点一下
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
就是产生一个指定长度的随机字符串。将对应的ascll码转换成字符串。我感觉没有错误的,编译没问题,但是对function做test时就会出现上面的问题。
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
我试了,没有问题, 你的测试代码是如何写的?
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
我直接test就有问题,编译没问题,你能得出结果吗?
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
我觉得应该是
v_temp := DBMS_RANDOM.value(48, 90);
EXIT WHEN(v_temp64);
这两句的问题,
既然要求值在58-64之间,为什么不直接指定random的范围呢?
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
不是要去58-64之间的值,刚好相反,我就是不要58-64这段值,只要是不是这段之间的值,就跳出循环
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
为何要用2个循环
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
LOOP
v_temp := DBMS_RANDOM.value(48, 90);
EXIT WHEN(v_temp64);
v_tempstring := CHR(v_temp);
DBMS_OUTPUT.put_line(v_tempstring);
END LOOP;
这里有问题
回复

使用道具 举报

千问 | 2007-7-4 17:27:50 | 显示全部楼层
对,这里是有问题,问题已经解决了。
v_tempstring := CHR(v_temp);
这个应该放在ENDLOOP后面
因为只要是值不再58到64之间跳出循环后,v_temp才能被赋值。
这样才能生成一个字符串。
谢谢了,各位大虾。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行