Oracle 我们可以创建一个PLSQL序列来提供随机值吗?

Oracle 我们可以创建一个PLSQL序列来提供随机值吗?,oracle,plsql,Oracle,Plsql,我的问题是关于PL SQL序列的,它需要给出起始值和最大值之间的随机值。我们能做到这一点吗 当然可以,使用DBMS\u 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

我的问题是关于PL SQL序列的,它需要给出起始值和最大值之间的随机值。我们能做到这一点吗

当然可以,使用
DBMS\u 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.

您可能需要查看整个软件包:

当然,请使用
DBMS\u 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.

您可能想看看整个软件包:

这里有一种可能有用的替代方法。它并不是完全随机的,因为它基本上只是取一个连续的序列号,然后把数字混在一起。为了避免像“100”和“1000”这样都返回数字“1”,我在起始值中添加了一个随机数字1-9

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

当然,您可以使用DBMS_随机方法,对目标table.column值进行检查,以检查尚未使用的值

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

我还没有彻底测试过这个

首先创建一个正常序列:

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
创建序列以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

这里有一个可能有用的替代方法。它并不是完全随机的,因为它基本上只是取一个连续的序列号,然后把数字混在一起。为了避免像“100”和“1000”这样都返回数字“1”,我在起始值中添加了一个随机数字1-9

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

当然,您可以使用DBMS_随机方法,对目标table.column值进行检查,以检查尚未使用的值

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

我还没有彻底测试过这个

首先创建一个正常序列:

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
创建序列以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

到目前为止您尝试过什么?可能重复您到目前为止尝试过的内容?可能重复而不是使用数字。。请尝试使用整数。您将获得数字形式的值。而不是使用数字。。请尝试使用整数。您将获得数字形式的值。