做數據庫開發或管理的人經常要創建大量的測試數據,動不動就需要上萬條,如果一條一條的錄入,那會浪費大量的時間,本文介紹了Oracle中如何通過一條SQL快速生成大量的測試數據的方法。
首先模擬一下100條的隨機數據
select rownum as id, to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime, trunc(dbms_random.value(0, 100)) as random_id, dbms_random.string('$', 20) random_string from dual connect by level <= 100;vcq9PC9wPgoKPHA+yc/D5lNRTMrHwPvTw8HLT3JhY2xlyv2+3b/i0++3qLXEvLi49sq108PQoby8x8nKtc/WtcSjujxicj4KMaGiwPvTw09yYWNsZczY09C1xKGwY29ubmVjdCBieaGxyvfQzsGsvdPT77eoyfqzybLiytS8x8K8o6yhsGxldmVsICZsdDs9IDEwobGx7cq+0qrJ+rPJMTC8x8K8o7s8YnI+CjKhosD708Nyb3dudW3Q6cTiwdDJ+rPJtd3U9rXE1fvK/cr9vt2juzxicj4KM6GiwPvTw3N5c2RhdGW6r8r9vNPSu9CpvPK1pdTLy+PAtMn6s8nI1cbayv2+3aOssb7A/dbQysfDv8z1vMfCvLXEyrG85LzTMcPro7s8YnI+CjShosD708NkYm1zX3JhbmRvbS52YWx1Zbqvyv3J+rPJy+a7+rXEyv0mIzIwNTQwO9DNyv2+3aOssb7A/dbQysfJ+rPJMLW9MTAw1q685LXEy+a7+tX7yv2juzxicj4KNaGiwPvTw2RibXNfcmFuZG9tLnN0cmluZ7qvyv3J+rPJy+a7+rXE19a3+9DNyv2+3aOssb7A/dbQysfJ+rPJs6S2yM6qMjC1xMvmu/rX1rf7tK6jrNfWt/u0rtbQv8nS1LD8wKjX1rf7u/LK/dfWoaM8YnI+CjwvcD4KPHA+ZGJtc19yYW5kb20uuq/K/dbQtcSyzsr9venJ3DwvcD4KPHA+PHByZSBjbGFzcz0="brush:sql;">-- **************************************** 隨機數字 *************************************************** select decode(trunc(dbms_random.value(0, 2)),'0','女','1','男') from dual select length(dbms_random.random) from dual; -- 產生一個任意長度為9,10,11位的數字 select abs(mod(dbms_random.random,100)) from dual; -- 產生一個100以內的隨機數 select trunc(10+90*dbms_random.value) from dual; -- 產生10~100之間的任意2位隨機整數(包含10,不包含100) select dbms_random.value from dual; -- 產生一個大於0小於1的隨機數小數(小數點後37或38位長度) select dbms_random.value(10,20) from dual; -- 產生一個大於10小於20的隨機數小數(小數點後38位) select dbms_random.normal from dual; -- normal函數返回服從正態分布的一組數。此正態分布標准偏差為1,期望值為0。這個函數返回的數值中有68%是介於-1與+1之間,95%介於-2與+2之間,99%介於-3與+3之間。 -- **************************************** 隨機日期 *************************************************** select to_date(trunc(dbms_random.value(to_number(to_char(sysdate-10, 'J')), to_number(to_char(sysdate, 'J')))), 'J') from dual; -- 在過去10天內取隨機日期 select (sysdate - 1 / 24 / 60 * 30) + dbms_random.value (1, 1800) / 3600 / 24 from dual; -- 在過去30分鐘內取隨機時間 select to_date(to_char(to_date('2015-01-01', 'yyyy-MM-dd'), 'J') + trunc(DBMS_RANDOM.VALUE(0, 365)), 'J') from dual; -- 查詢2015年中的任意日期 -- 在指定日期范圍內取隨機時間 select to_date(trunc(dbms_random.value(to_number(to_char(to_date('20150501', 'yyyymmdd'),'J')), to_number(to_char(to_date('20150531', 'yyyymmdd') + 1, 'J'))) ), 'J') + dbms_random.value(1, 3600) / 3600 prize_time from dual; -- 從現在開始到過去的100年之間的任意時刻 select to_date(trunc(dbms_random.value( to_number(to_char(add_months(sysdate,-100 * 12),'J')), to_number(to_char(sysdate + 1, 'J'))) ), 'J') + dbms_random.value(1, 3600) / 3600 from dual; -- **************************************** 隨機字符(產生任意長度為20的字符串) *************************************************** select dbms_random.string('u', 20) from dual -- 'u', 'U' 返回全是大寫的字符串(uppercase) 測算發現,只要參數不是一個中文或全角字符,返回數據均是大寫 select dbms_random.string('l', 20) from dual -- 'l', 'L' - 返回全是小寫的字符串(lowercase) select dbms_random.string('a', 20) from dual -- 'a', 'A' - 返回大小寫結合的字符串(mixed case) select dbms_random.string('x', 20) from dual -- 'x', 'X' - 返回全是大寫和數字的字符串(uppercase,alpha&numeric) select dbms_random.string('p', 20) from dual -- 'p', 'P' - 返回鍵盤上出現字符的隨機組合(any printable char)