精华内容
下载资源
问答
  • ORACLE 如何产生一个随机数:DBMS_RANDOM –1、小数( 0 ~ 1) select dbms_random.value from dual ; –2、指定范围内的小数 ( 0 ~ 100 ) select dbms_random.value(0,100) from dual ;–3、指定范围内的整数 ( 0 ~...

    ORACLE 如何产生一个随机数:DBMS_RANDOM
    –1、小数( 0 ~ 1)

     select dbms_random.value from dual ;
    

    –2、指定范围内的小数 ( 0 ~ 100 )
    select dbms_random.value(0,100) from dual ;

    –3、指定范围内的整数 ( 0 ~ 100 )

     select trunc(dbms_random.value(0,100)) from dual ;
    

    –4、长度为20的随机数字串

     select substr(cast(dbms_random.value as varchar2(38)),0,10) from dual ;
    

    –5、正态分布的随机数

     select dbms_random.normal from dual ;
    

    –6、随机字符串

     select dbms_random.string('x', 3) from dual ;
    
     /* opt可取值如下:
      'u','U'    :    大写字母
      'l','L'    :    小写字母
      'a','A'    :    大、小写字母
      'x','X'    :    数字、大写字母
      'p','P'    :    可打印字符*/
    

    –7、随机日期

     select to_date(2454084+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J') from dual ;
    

    /* 通过下面的语句获得指定日期的基数*/

     select to_char(sysdate,'J') from dual ;
    

    –8、生成GUID

     select sys_guid() from dual ;
    

    –生成带分隔符(-)的GUID的自定义函数
    –create or replace function my_guid
    return varchar2
    is
    guid varchar(36);
    temp varchar(32);
    begin
    temp:=sys_guid();
    guid:= substr(temp,1,8) || ‘-’
    ||substr(temp,9,4) || ‘-’
    ||substr(temp,13,4)|| ‘-’
    ||substr(temp,17,4)|| ‘-’
    ||substr(temp,21,12);
    return guid;
    end;

    数字、文本字符串和日期都是用户会在表格里碰到的三种常见数据类型。虽然你可以用PL/SQL程序包里的DBMS_RANDOM随机生成数字——它确实能够做到这一点——它还能够随机生成文本和日期值。

    1.产生随机数字
    就让我们先从数字开始。VALUE函数会返回一个大于等于0但是小于1的数,精度是38位。

    SELECT DBMS_RANDOM.VALUE FROM DUAL;

    对于指定范围内的整数,要加入参数low_value和high_value,并从结果中截取小数(最大值不能被作为可能的值)。所以对于0到99之间的整数,你要使用下面的代码:

    SELECT TRUNC(DBMS_RANDOM.VALUE(0, 100)) FROM DUAL;

    2.产生随机文本字符串
    要随机生成文本字符串,就要使用STRING函数并编写代码指定字符串的类型和所希望的长度:

    SELECT DBMS_RANDOM.STRING(‘A’, 20) FROM DUAL;

    类型代码在《Oracle Database 10g PL/SQL程序包和类型参考(oracle Database 10g PL/SQL Packages and Types Reference)》有说明。

    下面是一些类型的代码:

    ‘U’用来生成大写字符

    ‘L’用来生成小写字符

    ‘A’用来生成大小写混合的字符

    3.产生随机日期
    Oracle将日期作为过去某个关键日期(如果你好奇的话,我可以告诉你这个日期是公元前4712年1月1日)的整数偏移量来保存。这就意味着你可以通过寻找与你希望的起始日期相对应的整数,然后向它加入一个随机的整数来随机生成一个指定范围内的日期。

    使用TO_CHAR函数和‘J’格式代码,你可以为今天的日期生成一个内部日期数:

    SELECT TO_CHAR(SYSDATE, ‘J’) FROM DUAL;

    例如,要生成一个2003年内的任意日期,你可以首先确定2003年1月1日的日期整数;

    SELECT TO_CHAR(TO_DATE(‘01/01/03’,’mm/dd/yy’),’J’)FROM DUAL;

    系统给的结果是2452641。所以要生成该年度内的任意日期,我们就要用带有low_value等于2452641和high_value等于2452641+364参数的DBMS_RANDOM.VALUE,再把它转换成日期:

    SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2452641,2452641+364)),’J’) FROM DUAL;

    列表A:

    SQL> CREATE TABLE random_stuff (
    2 id NUMBER,
    3 date1 DATE,
    4 text1 VARCHAR2(40)
    5 );

    Table created.

    SQL> INSERT INTO random_stuff
    2 SELECT
    3 ROWNUM,
    4 TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2452641,2452641+364)),’J’),
    5 DBMS_RANDOM.STRING(‘A’,TRUNC(DBMS_RANDOM.VALUE(6,41)))
    6 FROM user_objects
    7 WHERE ROWNUM < 101;

    100 rows created.

    SQL> commit;

    Commit complete.

    SQL> SELECT *
    2 FROM random_stuff
    3 WHERE ROWNUM < 11;

        ID DATE1     TEXT1                                                      
    

         1 21-JAN-03 gAwQdhHSLBnu                                               
         2 28-SEP-03 cESSyTtblabklMGznSHj                                       
         3 22-NOV-03 nrnsGZCniTY                                                
         4 05-FEB-03 WCrFojHkic                                                 
         5 10-SEP-03 vlSliCaNQxZsBHbvKfiGnEMoXarR                               
         6 13-JUN-03 UnYLsIFOvkVezXJTByOpqVgwVSLKDFvvApIR                       
         7 02-JAN-03 WXffJhdxXN                                                 
         8 03-OCT-03 QimEpqGkVvNBJvZdwzegqgeYXUSEKJE                            
         9 14-JUL-03 pJlmGZeNNIfSEJFgIdNuRKnCFIzzLMOlXmvC                       
        10 24-DEC-03 JNnLJlndDcv                                               
    

    10 rows selected.
    列表A把上面的代码集中到了一起。它创建了一个叫做random_stuff的示例表格,这个表格有三个数据列:ID、date1和text1。它然后联合使用 ROWNUM和DBMS_RANDOM生成数据,在里面插入100个数据行。你可以使用任意至少带有100个数据行的表格进行子查询,因为真正表格里的数据列都不在SELECT列表里。

    展开全文
  • 活动码的生成规则是采用唯一的字符串开头后面是随机数字,比如AZ00001。使用oracle产生活动码速度极快,使用方便。1万个活动码只需要2~3秒就可以产生。下面是代码建一个临时表,用于存储生成的活动码create table T_...

    本人网站交友乐www.jyoule.com 需要经常生成随机的活动码,用于制作卡片密码或通过网络发送。活动码的生成规则是采用唯一的字符串开头后面是随机数字,比如AZ00001。使用oracle产生活动码速度极快,使用方便。1万个活动码只需要2~3秒就可以产生。下面是代码

    建一个临时表,用于存储生成的活动码

    create table T_RANDOM_CODE

    (

    code varchar2(20)

    );

    -- Create/Recreate primary, unique and foreign key constraints

    alter table T_RANDOM_CODE

    add constraint PK_T_RANDOM_CODE primary key (code);

    存储过程,根据输入的前缀和数量,生成不重复的活动码

    PROCEDURE create_random_code

    (

    p_number in number  --活动码生成数量

    ,p_prefix in varchar2   --活动码前缀

    ) as

    v_count  number;

    v_random number;

    v_num    number;

    v_code   varchar2(20);

    begin

    v_count := 0;

    WHILE v_count < p_number

    LOOP

    --活动码的位数可以在这里调整

    select dbms_random.value(10000000, 99999999)

    into v_random

    from dual;

    v_code := p_prefix || trunc(v_random);

    select count(*)

    into v_num

    from t_random_code

    where code = v_code;

    if v_num = 0 then

    insert into t_random_code (code) values (v_code);

    v_count := v_count + 1;

    end if;

    END LOOP;

    null;

    END create_random_code;

    展开全文
  • Oracle中如何生成随机数字、随机字符串、随机日期 详细实例脚本。
  • 介绍如何在 Oracle 数据库中使用系统程序包 DBMS_RANDOM 生成随机数据,包括随机数字、验证码、随机字符串以及随机日期和时间等,同时还介绍了如何从表中返回随机记录,以及如何生成 UUID。

    随机数据

    大家好,我是只谈技术不剪发的 Tony 老师。

    在日常生活中,随机数对于我们而言并不陌生,例如手机短信验证码就是一个随机的数字字符串;对于统计分析、机器学习等领域而言,通常也需要生成大量的随机数据用于测试、数据抽样、算法验证等。那么今天我们就来谈谈如何在 Oracle 数据库中生成随机数据。

    📝计算机生成的都是伪随机数,并不是真正的物理随机数。

    生成随机数字

    Oracle 提供了一个系统程序包 DBMS_RANDOM,可以用于生成随机数据,例如随机数字、随机字符串等。

    生成 0 到 1 之间的随机数

    DBMS_RANDOM.VALUE 函数可以用于生成一个大于等于 0 小于 1 的随机数字。例如:

    SELECT dbms_random.value FROM dual;
    VALUE                                   |
    ----------------------------------------|
    0.82366672879802619203358096665727275462|
    
    SELECT dbms_random.value FROM dual;
    VALUE                                   |
    ----------------------------------------|
    0.47093028485681981896753470853250955607|
    

    DBMS_RANDOM.VALUE 函数返回的数据包含 38 位小数,每次返回不同的数据。

    有时候,例如测试时,我们想要确保每次运行时生成相同的随机数。这种情况下,我们可以使用存储过程 DBMS_RANDOM.SEED 设置一个随机数种子,然后再创建随机数就可以返回固定的数值。例如:

    CALL dbms_random.seed(1);
    SELECT dbms_random.value FROM dual;
    VALUE                                   |
    ----------------------------------------|
    0.75096444209816859425547820733985992585|
    
    CALL dbms_random.seed(1);
    SELECT dbms_random.value FROM dual;
    VALUE                                   |
    ----------------------------------------|
    0.75096444209816859425547820733985992585|
    

    从结果可以看出,相同的种子返回了相同的随机数。每次运行随机数函数之前,都需要执行一次 DBMS_RANDOM.SEED 过程。

    📝除了整数类型的种子数之外,也可以使用字符串作为随机数的种子。

    生成指定范围内的随机数

    DBMS_RANDOM.VALUE 函数也可以接收两个输入参数:

    DBMS_RANDOM.VALUE(
      low  IN  NUMBER,
      high IN  NUMBER)
    RETURN NUMBER;
    

    这种形式的函数将会返回一个大于等于 low,小于 high 的随机数。例如:

    CALL dbms_random.seed(1);
    SELECT dbms_random.value(10, 20) FROM dual;
    DBMS_RANDOM.VALUE(10,20)                |
    ----------------------------------------|
    17.5096444209816859425547820733985992585|
    

    以上示例返回了一个大于等于 10,小于 20 的数字。

    如果想要生成某个范围内的随机整数,可以利用 DBMS_RANDOM.VALUE 加上 TRUNC 函数实现。例如:

    CALL dbms_random.seed(1);
    SELECT trunc(dbms_random.value(10, 20)) v FROM dual;
    V |
    --|
    17|
    

    注意,以上语句返回的是大于等于 10,小于等于 19(不是 20)的整数。

    生成 6 位数字手机验证码

    以下语句可以用于生成一个由 6 位数字字符组成的验证码:

    CALL dbms_random.seed(0);
    SELECT lpad(trunc(dbms_random.value(0, 1000000)),6,'0') captcha FROM dual;
    CAPTCHA|
    -------|
    063365 |
    

    lpad 函数可以确保数据不够 6 位时在前面补足 0。

    生成标准正态分布随机数

    DBMS_RANDOM.VALUE 函数生成的是一个均匀分布的随机数,而 DBMS_RANDOM.NORMAL 函数可以用于返回一个遵循标准正态分布(期望值为 0,标准差为 1)的随机数。例如:

    CALL dbms_random.seed(1);
    SELECT dbms_random.normal FROM dual;
    NORMAL                                    |
    ------------------------------------------|
    0.4116858715102697161411270380245532257962|
    

    生成随机字符串

    生成固定长度的随机字符串

    除了随机数字之外,DBMS_RANDOM.STRING 函数可以用于产生一个随机字符串:

    DBMS_RANDOM.STRING
       opt  IN  CHAR,
       len  IN  NUMBER)
      RETURN VARCHAR2;
    

    其中,参数 opt 可以指定返回字符串的类型:

    • ‘u’, ‘U’,返回由大写字母组成的字符串;
    • ‘l’, ‘L’,返回由小写字母组成的字符串;
    • ‘a’, ‘A’,返回由大小写混合字母组成的字符串;
    • ‘x’, ‘X’,返回由大写字母和数字组成的字符串;
    • ‘p’, ‘P’,返回由任意可打印字符组成的字符串;
    • 其他参数,返回由大写字母组成的字符串。

    参数 len 表示返回字符串的长度。例如:

    CALL dbms_random.seed(1);
    SELECT dbms_random.string('p', 10) FROM dual;
    DBMS_RANDOM.STRING('P',10)|
    --------------------------|
    gqB!U5t^a6                |
    

    以上示例返回了一个长度为 10,由任意可打印字符组成的随机字符串。

    生成可变长度的随机字符串

    那么,怎么返回一个长度可变的随机字符串呢?很简单,将 DBMS_RANDOM.STRING 和 DBMS_RANDOM.VALUE 函数结合一下就可以了。例如:

    CALL dbms_random.seed(1);
    SELECT dbms_random.string('p', trunc(dbms_random.value(10,21))) AS random_string FROM dual;
    RANDOM_STRING     |
    ------------------|
    qB!U5t^a6ZFUoIw|O^|
    

    以上示例返回了一个随机长度大于等于 10 且小于等于 20,由任意可打印字符组成的随机字符串。

    生成随机日期

    将指定日期或者时间戳增加一个随机的数字,就可以得到随机的日期和时间戳。例如:

    CALL dbms_random.seed(1);
    SELECT trunc(date '2020-01-01'+dbms_random.value(0,31)) rand_date,
           timestamp '2020-01-01 00:00:00'+dbms_random.value(0,31) rand_ts
    FROM dual;
    RAND_DATE          |RAND_TS            |
    -------------------|-------------------|
    2020-01-24 00:00:00|2020-01-27 16:07:37|
    

    以上示例返回了 2020 年 1 月中的某个随机日期和时间戳。

    获取随机记录

    对于查询语句,如果返回多行数据,DBMS_RANDOM 程序包中的函数会返回不同的随机数据。例如:

    CALL dbms_random.seed(1);
    SELECT dbms_random.value FROM employee;
    VALUE                                   |
    ----------------------------------------|
    0.75096444209816859425547820733985992585|
    0.86038577935739084599473227591041135085|
    0.36531856164744564910966598428812048036|
    ...
    

    利用这个特性,我们可以从表中返回随机的数据行。例如:

    CALL dbms_random.seed(1);
    SELECT emp_id, emp_name
    FROM employee 
    ORDER BY dbms_random.value
    FETCH FIRST 5 ROWS ONLY;
    EMP_ID|EMP_NAME |
    ------|---------|
        10|廖化      |
        24|简雍      |
        20|蒋琬      |
         6|魏延      |
         4|诸葛亮    |
    

    以上示例从 employee 表中返回了随机的 5 行数据。

    另外,Oracle 还提供了一个 SAMPLE 子句,可以用于返回按照百分比指定的随机抽样数据。例如:

    SELECT emp_id, emp_name
    FROM employee sample (10) seed(1);
    EMP_ID|EMP_NAME |
    ------|---------|
         4|诸葛亮    |
         5|黄忠      |
        16|周仓      |
    

    以上示例返回了 employee 表中抽样 10% 的随机数据(employee 表共计有 25 条数据),seed 用于设置随机抽样的种子。

    ⚠️SAMPLE 子句是一种基于数据库统计信息的预估,如果统计数据不准确,查询结果可能会存在较大偏差。

    生成 UUID

    UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。

    Oracle 提供了一个系统函数 SYS_GUID(),可以用于生成 GUID。例如:

    SELECT rawtohex(sys_guid()) FROM dual;
    RAWTOHEX(SYS_GUID())            |
    --------------------------------|
    ACCDB38D17FA1103E05579D90B3808D7|
    

    如果想要生成带中划线(-)的 UUID,可以创建以下自定义函数:

    CREATE OR REPLACE FUNCTION new_guid
    RETURN varchar2
    AS
      lv_guid varchar(32);
    BEGIN
      lv_guid:=rawtohex(sys_guid());
      RETURN substr(lv_guid,1,8) || '-'
           ||substr(lv_guid,9,4) || '-'
           ||substr(lv_guid,13,4)|| '-'
           ||substr(lv_guid,17,4)|| '-'
           ||substr(lv_guid,21,12);
    END;
    /
    

    new_guid 函数只是基于系统函数 sys_guid 返回的结果增加了 4 个中划线。试用一下:

    SELECT new_guid() FROM dual;
    NEW_GUID()                          |
    ------------------------------------|
    ACCDB38D-17FD-1103-E055-79D90B3808D7|
    

    总结

    本文总结了在 Oracle 数据库中使用系统程序包 DBMS_RANDOM 生成随机数据的方法,包括随机数字、验证码、随机字符串以及随机日期和时间等,同时还介绍了如何从表中返回随机记录,以及如何生成 UUID。

    如果觉得文章对你有用,欢迎关注❤️、评论📝、点赞👍!

    展开全文
  • opt可取值如下: ‘u’,‘U’ : 大写字母 ‘l’,‘L’ : 小写字母 ‘a’,‘A’ : 大、小写字母 ‘x’,‘X’ : 数字、大写字母 ‘p’,‘P’ : 可打印字符 但是我想去大小写+数字 于是: for i in 1..10 loop m

    select dbms_random.string(opt, length) from dual
    opt可取值如下: ‘u’,‘U’ : 大写字母 ‘l’,‘L’ : 小写字母 ‘a’,‘A’ : 大、小写字母 ‘x’,‘X’ : 数字、大写字母 ‘p’,‘P’ : 可打印字符
    但是我想去大小写+数字 于是:

         for i in 1..10 loop
                  my_str := my_str || dbms_random.string(
                case when dbms_random.value(0,1) < 0.5 then 'l' else 'x' end,1);
                   end loop; 
    

    my_str就是随机大小写数字
    注意:1…10是循环10位字符。可以按照需求指定1…?

    展开全文
  • Oracle 生成随机密码

    千次阅读 2013-08-19 14:28:42
    oracle数据库中有可已生成随机密码包dbms_random,但是用起来有点儿不方便,满足不了上面的需求。一些网页工具或者小软件,使用起来也不方便。 所以就想在oracle自己写函数来实现,并且可以建立数据库表方便管理密码...
  • oracle生成随机字符串

    2021-07-28 23:56:53
    oracle拼接随机字符串生成主键前言 前言 记录一下在Oracle中用年月日时分秒拼随机字符串生成主键的一种操作 ----dbms_random.string (opt char, len number); --opt:表示返回值可能包含的东西 --len:表示要返回的...
  • create or replace procedure create_callstatistic as begin for i in 1..4000000 loop insert into up_callstatistic_data(USERIDENTIFIER,UPNUMBER,CALLINGADDRESS,CALLINGAREANUMBER,CALLEDADDRESS,CALLEDA...
  • oracle生成随机字符串 当我们构造数据库测试案例时,有时会生成需要使用生成随机长度的字符串 使用dbms_random.string方法生成 官方引用: ...使用说明: DBMS_RANDOM.STRING opt IN CHAR, ...
  • Oracle 生成随机日期

    2021-08-22 22:30:58
    一、生成2021-07-01与2021-07-10之间的连续日期 select to_date('2021-07-01','yyyy-mm-dd') - 1 + rownum dt from dual connect by rownum <= floor(to_date('2021-07-10','yyyy-mm-dd') - to_date('2021-07...
  • Oracle生成随机

    2011-01-30 10:29:16
    活动码的生成规则是采用唯一的字符串开头后面是随机数字,比如AZ00001。使用oracle产生活动码速度极快,使用方便。1万个活动码只需要2~3秒就可以产生。下面是代码 建一个临时表,用于存储生成的活动码 create ...
  • Oracle生成随机函数

    2016-01-07 14:54:56
    1.产生随机数字 就让我们先从数字开始。VALUE函数会返回一个大于等于0但是小于1的数,精度是38位。 SELECT DBMS_RANDOM.VALUE FROM DUAL;  对于指定范围内的整数,要加入参数low_value和high_...
  • 生成GUID,全球唯一标识 select sys_guid() from dual ; 小数( 0 ~ 1) select dbms_random.value from dual ; 指定范围内的小数 ( 0 ~ 100 ) select dbms_random.value(0,100) from dual ; 指定范围内的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,854
精华内容 7,941
关键字:

oracle生成随机数字