Oracle隨機函式的取法

bfc99發表於2014-10-16

簡單得說,通過dbms_random包呼叫隨機數的方法大致有4種:

1、dbms_random.normal

這個函式不帶引數,能返回normal distribution的一個number型別,所以基本上隨機數會在-1到1之間。(注:本人測試發現大部分隨機數會在-5至5之間)

    簡單測試了一下,產生100000次最大能到5左右:

    SQL> declare
      2    i number:=0;
      3    j number:=0;
      4 begin
      5    for k in 1 .. 100000 loop
      6    i:= dbms_random.normal;
      7      if i > j
      8        then j:=i;
      9      end if;
      10    end loop;
      11    dbms_output.put_line(j);
      12 end;
      13 /

    5.15325081797418404136433867107468983182

    PL/SQL procedure successfully completed

2、dbms_random.random

    這個也沒有引數,返回一個從-power(2,31)到power(2,31)的整數值。(注:是整數值)

3、dbms_random.value

    這個函式分為兩種,一種是沒有引數,則直接返回0-1之間的38位小數。(注:更確切地說是大於等於0,而小於1的小數)

    SQL > column value format 9.99999999999999999999999999999999999999
    SQL > select dbms_random.value from dual;

                                        VALUE
    -----------------------------------------
      .58983014999643548701631750396301271752

    第二種是加上兩個引數a、b,則返回值在a、b之間的38位小數。(注:更確切地說是大於等於a,而小於b的小數)

    SQL > column value format 999.999999999999999999999999999999999999
    SQL > select dbms_random.value(100,500) value from dual;

                                        VALUE
    -----------------------------------------
      412.150194612502916808701157054098274240

    注意:無論前面幾位,小數點之後都是38位

4、dbms_random.string

    這個函式必須帶有兩個引數,前面的字元指定型別,後面的數值指定位數(最大60) (注,在11.2.0.3上測試,位數可以指定無限大,但實際生成的最大長度只能到4000)

    型別說明:

    'u','U' : upper case alpha characters only

    'l','L' : lower case alpha characters only

    'a','A' : alpha characters only (mixed case)

    'x','X' : any alpha-numeric characters (upper)

    'p','P' : any printable characters


    SQL > column value format a30
    SQL > select dbms_random.string('u',30) value from dual;

    VALUE
    ------------------------------
    VTQNLGISELPXEDBXKUZLXKBAJMUTIA

    SQL > select dbms_random.string('l',30) value from dual;

    VALUE
    ------------------------------
    uqygsbquingfqdytpgjvdoblxeglgu

    SQL > select dbms_random.string('a',30) value from dual;

    VALUE
    ------------------------------
    NGTGkQypuSWhBfcrHiOlQwOUXkqJjy

    SQL > select dbms_random.string('x',30) value from dual;

    VALUE
    ------------------------------
    UVWONYJMXT31VEFPD736WJCJ5QT6BD

    SQL > select dbms_random.string('p',30) value from dual;

    VALUE
    ------------------------------
    :mak$(WT4M_7c/+f[_XUscf$P Zcq{

5、關於seed

    可以設定seed來確定隨機數的起始點,對於相同的seed而言,隨機數的任意一次變化都將是確定的。

    就是說,如果在某一時刻呼叫了seed,之後第一次產生的隨機數是4,第二次是6,第三次是1,那麼當你再次呼叫相同的seed之後,一次產生的隨機數還是4、6、1

    seed有兩種,一種是數值型的,一種是字元型(最大長度2000)的

    -- Seed with a binary integer

    PROCEDURE seed(val IN BINARY_INTEGER );

    PRAGMA restrict_references (seed, WNDS );

    -- Seed with a string (up to length 2000)

    PROCEDURE seed(val IN VARCHAR2 );

    PRAGMA restrict_references (seed, WNDS );


6、關於initialize

    一個integer引數,註釋說的很清楚了:

    -- Obsolete, just calls seed(val)

    PROCEDURE initialize(val IN BINARY_INTEGER );

    PRAGMA restrict_references (initialize, WNDS );


sys_guid()

    官方文件的說明如下:


    SYS_GUID generates and returns a globally unique identifier (RAW value) made up of 16 bytes. On most platforms, the generated identifier consists of a host identifier, a process or thread identifier of the process or thread invoking the function, and a nonrepeating value (sequence of bytes) for that process or thread.

    簡單得說就是,隨機生成一個32位的RAW,但是後面的那段經過實驗發現不是這麼回事,每次生成的字串都千差萬別,不知道為什麼。

    在具體應用中,除了可以用來插入生成唯一的識別符號外,還可以用來取表中的任意一條記錄:

    select * from ( select * from t2 order by sys_guid()) where rownum = 1 ;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22207394/viewspace-1300437/,如需轉載,請註明出處,否則將追究法律責任。

相關文章