Oracle 我们可以创建一个PLSQL序列来提供随机值吗?
我的问题是关于PL SQL序列的,它需要给出起始值和最大值之间的随机值。我们能做到这一点吗 当然可以,使用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
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
到目前为止您尝试过什么?可能重复您到目前为止尝试过的内容?可能重复而不是使用数字。。请尝试使用整数。您将获得数字形式的值。而不是使用数字。。请尝试使用整数。您将获得数字形式的值。