PLSQL生成随机整数

Jus*_*tin 5 sql oracle plsql oracle11g oracle-sqldeveloper

在Oracle Sql developer 11g中,如何生成随机整数并将其分配给变量?这是我到目前为止所尝试的:

S_TB := SELECT dbms_random.value(1,10) num FROM dual;
Run Code Online (Sandbox Code Playgroud)

使用此代码我收到错误:

S_TB := SELECT dbms_random.value(1,10) num FROM dual
Error report -
Unknown Command
Run Code Online (Sandbox Code Playgroud)

解决我的问题的正确方法是什么?

APC*_*APC 17

变量需要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;
Run Code Online (Sandbox Code Playgroud)

虽然,您不需要使用查询语法.这是有效的,更好的做法:

declare
    n pls_integer;
begin
    n := dbms_random.value(1,10);
end; 
Run Code Online (Sandbox Code Playgroud)


Tas*_*ker 8

对于一组随机均匀分布的连续整数(在下面的示例中,介于 1 和 10 之间),我建议:

select round(dbms_random.value(0.5,10.49999999999),0) from dual
Run Code Online (Sandbox Code Playgroud)

否则我会无意中将集合中的第一个和最后一个数字限制为被选为集合其余部分的概率的一半。

正如 q3kep 和 GolezTrol 所指出的,dbms_random.value(x, y) 为大于或等于x 且小于y 的值提供均匀随机分布。因此,以下任一项是合适的:

select trunc(dbms_random.value(1,11)) from dual
Run Code Online (Sandbox Code Playgroud)

或者

select round(dbms_random.value(0.5, 10.5), 0) from dual
Run Code Online (Sandbox Code Playgroud)

根据文档


mah*_*707 5

或者,您可以创建用于生成随机数的函数.这可以在代码中的任何位置使用.

    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;
    /
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

功能创建.

SQL>从dual中选择Random;

随机

     6                                                                                                                  
Run Code Online (Sandbox Code Playgroud)

SQL>从dual中选择Random;

随机

     9                                                                                                                  
Run Code Online (Sandbox Code Playgroud)

  • 这不仅仅是内置功能的无意义包装吗?实际上比无意义更糟糕,因为它隐藏了对DUAL的额外调用,并使用FLOOR()模糊了精确的返回值.另外,输入参数的重点是什么? (3认同)

小智 5

如果你想得到一个随机数的 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;
Run Code Online (Sandbox Code Playgroud)