首页 文章

我们能够创建一个给出随机值的PLSQL序列吗?

提问于
浏览
0

我的问题是PL SQL序列需要在start和value和max值之间给出随机值 . 我们能做到吗?

2 回答

  • 0

    当然,请使用 DBMS_RANDOM.VALUE . 以下是概念的简要证明:

    set serveroutput on
    
    declare
      x number;
    begin
      x := dbms_random.value(3, 9);
      dbms_output.put_line(x);
    end;
    /
    
    7.77738390408807611656323701045019115674
    
    
    PL/SQL procedure successfully completed.
    

    你可能想看看整个包装:https://docs.oracle.com/database/121/ARPLS/d_random.htm#ARPLS040

  • 2

    这是一种可能有用的替代方法 . 它并不是随机的,因为它基本上只是采用顺序序列号并将数字混杂在一起 . 为了避免像'100'和'1000'这样的数字都返回数字'1',我将一个随机数字1-9添加到起始值 .

    这个直接随机数的原因是为了避免值返回中的重复/冲突,这将随机函数发生 .

    您当然可以使用DBMS_RANDOM方法并对目标table.column值进行检查以检查尚未使用的值 .

    所以,这是我快速而肮脏的随机解决方案:

    我还没有彻底测试过这个 .

    首先创建一个正常的序列:

    CREATE SEQUENCE the_seq START WITH 10000;

    现在函数随机加扰从序列返回的数字:

    CREATE OR REPLACE FUNCTION get_seq_val RETURN NUMBER IS
       l_seq_val   VARCHAR2(50);
       l_ret_val   VARCHAR2(50);
       l_seq_len   NUMBER;
       l_digit     NUMBER;
    BEGIN
       SELECT RTRIM(LTRIM(TO_CHAR(the_seq.NEXTVAL))) INTO l_seq_val FROM dual;
       DBMS_OUTPUT.PUT ( 'Seq: ' || l_seq_val );
       l_seq_len := LENGTH(l_seq_val);
       l_ret_val := TRUNC(dbms_random.value(1,9)); -- Avoid having 0 as leading digit below
       DBMS_OUTPUT.PUT ( ' Ret: ' || l_ret_val );
       FOR i IN 1 .. l_seq_len LOOP
          l_digit := TRUNC(dbms_random.value(1, LENGTH(l_seq_val)));
          l_ret_val := l_ret_val || SUBSTR(l_seq_val, l_digit, 1);
          l_seq_val := REGEXP_REPLACE(l_seq_val, '(?<=^.{' || l_digit || '})', '' );
          DBMS_OUTPUT.PUT ( ' Dig: ' || l_digit );
          DBMS_OUTPUT.PUT ( ' NowSeq: ' || l_seq_val );
          DBMS_OUTPUT.PUT ( ' Ret: ' || l_ret_val );
       END LOOP;
       DBMS_OUTPUT.PUT_LINE ( ' RETURN: ' || l_ret_val );
       RETURN l_ret_val;
    END;
    /
    
    show err
    

    现在TEst它:

    select rn, get_seq_val() sv from ( select rownum rn from dual connect by level < 20 );
    

    我的输出:

    RN         SV
    ---------- ----------
             1     801410
             2     610011
             3     140441
             4     514411
             5     341400
             6     341100
             7     801404
             8     301404
             9     310014
            10     800100
            11     615005
            12     510500
            13     850155
            14     205000
            15     201000
            16     705100
            17     550050
            18     411555
            19     615000
    
    19 rows selected.
    

相关问题