PLSQL 生成随机整数
PLSQL generate random integer
在 Oracle Sql developer 11g 中,如何生成随机整数并将其分配给变量?这是我到目前为止尝试过的:
S_TB := SELECT dbms_random.value(1,10) num FROM dual;
使用这段代码我得到了错误:
S_TB := SELECT dbms_random.value(1,10) num FROM dual
Error report -
Unknown Command
解决我的问题的正确方法是什么?
变量需要PL/SQL;从你的问题中不清楚你的代码是否是一个正确的 PL/SQL 块。在 PL/SQL 中,变量是使用 INTO 语法而不是您正在使用的赋值语法从查询中填充的。
declare
txt varchar2(128);
n pls_integer;
begin
-- this is how to assign a literal
txt := 'your message here';
-- how to assign the output from a query
SELECT dbms_random.value(1,10) num
into n
FROM dual;
end;
不过,您不需要使用查询语法。这是有效的,也是更好的做法:
declare
n pls_integer;
begin
n := dbms_random.value(1,10);
end;
或者,您可以创建一个函数来生成随机数。
这可以在代码的任何地方使用。
create or replace function RANDOM
return number
is
a number ;
begin
select round(dbms_random.value(1,10)) rnum
into a
from dual;
return a ;
end;
/
输出:
函数已创建。
SQL> select 双随机;
随机
6
SQL> select 双随机;
随机
9
整数:
select dbms_random.random from dual
正整数:
select abs(dbms_random.random) from dual
对于一组随机均匀分布的连续整数(在下面的例子中介于 1 和 10 之间),我建议:
select round(dbms_random.value(0.5,10.49999999999),0) from dual
否则我会无意中将集合中的第一个和最后一个数字限制为被选为集合其余部分的概率的一半。
正如 q3kep 和 GolezTrol 所指出的,dbms_random.value(x, y) 为 大于或等于 的值提供均匀随机分布 x 且 小于 y。所以以下任何一个都是合适的:
select trunc(dbms_random.value(1,11)) from dual
或
select round(dbms_random.value(0.5, 10.5), 0) from dual
如果你想获得n位的随机数你可以这样做
CREATE OR REPLACE FUNCTION NUM_RANDOM(N IN NUMBER)
RETURN NUMBER
AS
BEGIN
RETURN TRUNC (DBMS_RANDOM.VALUE(POWER(10, N - 1), POWER(10, N) - 1));
END NUM_RANDOM;
DECLARE
l_check Integer:=1;
BEGIN
WHILE l_check < 5 LOOP
l_check := DBMS_RANDOM.VALUE(1,10);
DBMS_OUTPUT.PUT_LINE(l_check);
END LOOP;
END;
-- DBMS_RANDOM.VALUE给出范围内的随机值
在 Oracle Sql developer 11g 中,如何生成随机整数并将其分配给变量?这是我到目前为止尝试过的:
S_TB := SELECT dbms_random.value(1,10) num FROM dual;
使用这段代码我得到了错误:
S_TB := SELECT dbms_random.value(1,10) num FROM dual
Error report -
Unknown Command
解决我的问题的正确方法是什么?
变量需要PL/SQL;从你的问题中不清楚你的代码是否是一个正确的 PL/SQL 块。在 PL/SQL 中,变量是使用 INTO 语法而不是您正在使用的赋值语法从查询中填充的。
declare
txt varchar2(128);
n pls_integer;
begin
-- this is how to assign a literal
txt := 'your message here';
-- how to assign the output from a query
SELECT dbms_random.value(1,10) num
into n
FROM dual;
end;
不过,您不需要使用查询语法。这是有效的,也是更好的做法:
declare
n pls_integer;
begin
n := dbms_random.value(1,10);
end;
或者,您可以创建一个函数来生成随机数。 这可以在代码的任何地方使用。
create or replace function RANDOM
return number
is
a number ;
begin
select round(dbms_random.value(1,10)) rnum
into a
from dual;
return a ;
end;
/
输出:
函数已创建。
SQL> select 双随机;
随机
6
SQL> select 双随机;
随机
9
整数:
select dbms_random.random from dual
正整数:
select abs(dbms_random.random) from dual
对于一组随机均匀分布的连续整数(在下面的例子中介于 1 和 10 之间),我建议:
select round(dbms_random.value(0.5,10.49999999999),0) from dual
否则我会无意中将集合中的第一个和最后一个数字限制为被选为集合其余部分的概率的一半。
正如 q3kep 和 GolezTrol 所指出的,dbms_random.value(x, y) 为 大于或等于 的值提供均匀随机分布 x 且 小于 y。所以以下任何一个都是合适的:
select trunc(dbms_random.value(1,11)) from dual
或
select round(dbms_random.value(0.5, 10.5), 0) from dual
如果你想获得n位的随机数你可以这样做
CREATE OR REPLACE FUNCTION NUM_RANDOM(N IN NUMBER)
RETURN NUMBER
AS
BEGIN
RETURN TRUNC (DBMS_RANDOM.VALUE(POWER(10, N - 1), POWER(10, N) - 1));
END NUM_RANDOM;
DECLARE
l_check Integer:=1;
BEGIN
WHILE l_check < 5 LOOP
l_check := DBMS_RANDOM.VALUE(1,10);
DBMS_OUTPUT.PUT_LINE(l_check);
END LOOP;
END;
-- DBMS_RANDOM.VALUE给出范围内的随机值