我的问题是PL SQL序列需要在start和value和max值之间给出随机值 . 我们能做到吗?
当然,请使用 DBMS_RANDOM.VALUE . 以下是概念的简要证明:
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
这是一种可能有用的替代方法 . 它并不是随机的,因为它基本上只是采用顺序序列号并将数字混杂在一起 . 为了避免像'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.
2 回答
当然,请使用
DBMS_RANDOM.VALUE
. 以下是概念的简要证明:你可能想看看整个包装:https://docs.oracle.com/database/121/ARPLS/d_random.htm#ARPLS040
这是一种可能有用的替代方法 . 它并不是随机的,因为它基本上只是采用顺序序列号并将数字混杂在一起 . 为了避免像'100'和'1000'这样的数字都返回数字'1',我将一个随机数字1-9添加到起始值 .
这个直接随机数的原因是为了避免值返回中的重复/冲突,这将随机函数发生 .
您当然可以使用DBMS_RANDOM方法并对目标table.column值进行检查以检查尚未使用的值 .
所以,这是我快速而肮脏的随机解决方案:
我还没有彻底测试过这个 .
首先创建一个正常的序列:
CREATE SEQUENCE the_seq START WITH 10000;
现在函数随机加扰从序列返回的数字:
现在TEst它:
我的输出: