【问题标题】:PLSQL generate random integerPLSQL 生成随机整数
【发布时间】:2015-08-05 17:18:47
【问题描述】:

在 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

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

【问题讨论】:

    标签: sql oracle plsql oracle11g oracle-sqldeveloper


    【解决方案1】:

    变量需要 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; 
    

    【讨论】:

    • 好吧,据我了解,“n”是变量的名称。但是,“txt”是干什么用的?当我想使用变量时,我是用“n”还是“txt”?
    • 好的,感谢您编辑您的帖子。正如他们在互联网上所说:“你是真正的 MVP”。
    【解决方案2】:

    对于一组随机均匀分布的连续整数(在下面的例子中在 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
    

    根据documentation

    【讨论】:

    • 或者可能是 trunc(dbms_random.value(1,11)) ?
    • dbms_random.value(1,11) 返回一个值1 <= result < 11,它永远不应该返回 11。
    【解决方案3】:

    或者,您可以创建一个用于生成随机数的函数。 这可以在代码的任何地方使用。

        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> 从对偶中选择随机;

    随机

         6                                                                                                                  
    

    SQL> 从对偶中选择随机;

    随机

         9                                                                                                                  
    

    【讨论】:

    • 这不只是对内置功能的无意义的包装吗?实际上比无意义更糟糕,因为它隐藏了对 DUAL 的额外调用,并使用 FLOOR() 混淆了精确的返回值。另外,输入参数的意义何在?
    • 谢谢。用 ROUND() 更新。
    • 它的分布不均匀 - 1 和 10 的返回频率比其他数字少两倍左右。 trunc(dbms_random.value(1,11)) 可以解决问题。
    【解决方案4】:

    如果你想得到一个 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;
    

    【讨论】:

      【解决方案5】:

      整数:

      select dbms_random.random from dual
      

      正整数:

      select abs(dbms_random.random) from dual
      

      【讨论】:

        【解决方案6】:
        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 给出范围内的随机值。

        【讨论】:

          猜你喜欢
          • 2018-10-09
          • 2014-08-22
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 2020-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多