Oracle dbms_random 生成隨機數 隨機字符串 隨機日期

Intro

  • 背景
    需求:數據表中有幾列數據爲空(不全),我需要填充他們,以便測試。
    解決方法大致有幾種:

    • 依賴層最多的一項:寫代碼執行數據庫插入操作。在編程語言拼SQL參數的時候,插入生成的隨機數。
    • 寫代碼,利用for循環 + 隨機數/隨機字符串,生成SQL的寫操作語句。然後在數據庫客戶端執行這些語句。
    • 依賴最少的一項:直接在SQL中生成隨機數。直接執行SQL語句即可。保存SQL片段也方便,以便下次執行。
      不想很麻煩的去編寫接口。所以我選了第三種。
  • 以下是我最終的SQL格式:

update table_name 
set 
    field1 = 隨機數,
    field2 = 隨機字符串,
    field3 = 隨機日期

注意以上語句沒有where子句。也就是說會對錶中的所有記錄的對應字段進行值的修改,效果相當於for循環

SQL

  • 測試語句
    select xxx from dual,其中xxx可爲任意值

隨機數

dbms_random.value 返回一個隨機數,區間在[0, 1),注意區間爲左開右閉即區間不包含1。
dbms_random.value(a, b) 返回一個隨機數,區間在[a, b),同樣:b不在區間內。
NOTE 以上兩種方法,返回值都帶着一串小數。
想要截取整數,要用到trunc(number, precision),如:trunc(123.456)返回123。(precision默認爲0)

隨機字符串

random.string('L', length) 返回長度爲length、由隨機的小寫字符填充的字符串。
第一個參數的可選值:
L Lower 小寫的。
U Upper 大寫的。
A Admix 大小寫混合的。

隨機日期

每個日期對應一個數值。
首先,查看今天的數值:to_char(sysdate, 'J') 今天是2020-02-16,返回值爲2458901

那我想生成的日期範圍:[今天, 今天+30天],即從天開始的30天(第30天不包含)。
to_date(2458901, 'J') 就是今天(date類型)
to_date(2458901 + 30, 'J') 就是30天后。
由隨機函數生成這個要增加的數值,可以達到目的。
to_date(2458901 + trunc(dbms_random.value(1, 30)), 'J')

Others

trunc(sysdate, 'J')

發佈了283 篇原創文章 · 獲贊 156 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章