Oracle データベース に 大量のテストデータ を PL/SQL を利用して投入する サンプルコード と 関連する内容 をまとめました。
目次
データ投入 の 基本形
本来なら INSERT だけでいいところなのですが… SELECT, UPDATE, DELETE も念のため組み込んだ サンプルコード を作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | SET SERVEROUTPUT ON ; DECLARE vUSER_ID NUMBER; vUSER_NAME VARCHAR2(100); vRANK_CODE NUMBER; vMAX_COUNT NUMBER := 1000; vCOMMIT_UNIT NUMBER := 100; BEGIN FOR i IN 1..vMAX_COUNT LOOP BEGIN -- 代入する値の作成 vUSER_NAME := '会員' || i || DBMS_RANDOM.STRING( 'a' , DBMS_RANDOM.VALUE(1,3)); vUSER_ID := 100 + i; -- SELECT 処理 SELECT CODE INTO vRANK_CODE FROM M_USER_RANK WHERE DISPLAY_NAME = 'ルーキー' ; -- INSERT 処理 INSERT INTO T_USER ( USER_ID, USER_NAME, USER_NAME_KANA ) VALUES ( vUSER_ID, vUSER_NAME, ( 'カイイン' || i) ); -- UPDATE 処理 UPDATE T_USER SET RANK_CODE = vRANK_CODE WHERE USER_ID = vUSER_ID; -- DELETE 処理 DELETE FROM T_HISTORY WHERE USER_ID = vUSER_ID; -- vCOMMIT_UNIT 毎 にコミット IF (mod(i, vCOMMIT_UNIT) = 0) THEN COMMIT ; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'エラー:' || i); END ; END LOOP; COMMIT ; END ; / |
シーケンスの取得
1 2 3 4 5 6 7 | DECLARE vUserID NUMBER; BEGIN vUserID := DEMO_USERS_SEQ.nextval; DBMS_OUTPUT.put_line(vUserID); END ; / |
ランダムな値の取得
ランダムな数値 (乱数)
vMIN から vMAX の乱数を取得します。 DBMS_RANDOM.VALUE の結果は少数を含むため 四捨五入 ( 0.5 を足して FLOOR ) しています。
1 2 3 4 5 6 7 8 9 | DECLARE vMIN NUMBER := 1; vMAX NUMBER := 100; vRANDOM NUMBER; BEGIN vRANDOM := FLOOR(DBMS_RANDOM.VALUE(vMIN, vMAX) + 0.5); DBMS_OUTPUT.put_line(vRANDOM); END ; / |
ランダムな文字列
ランダムな文字列生成は DBMS_RANDOM.STRING を利用します。 DBMS_RANDOM.STRING 関数 は OPT (出力する文字種) と LEN (文字列長) を指定できます。
1 2 3 4 5 6 7 8 9 | DECLARE vOPT VARCHAR2(1) := 'u' ; vLEN NUMBER := 5; vRANDOM VARCHAR2(100); BEGIN vRANDOM := DBMS_RANDOM.STRING(vOPT, vLEN); DBMS_OUTPUT.put_line(vRANDOM); END ; / |
vOPT に指定できる文字列は以下の通りです。
- 'u'、'U'
- 大文字のアルファベット文字で文字列を戻します。
- 'l'、'L'
- 小文字のアルファベット文字で文字列を戻します。
- 'a'、'A'
- 大/小文字が混在したアルファベット文字で文字列を戻します。
- 'x'、'X'
- 大文字のアルファベット文字と数字で文字列を戻します。
- 'p'、'P'
- 印刷可能な任意の文字で文字列を戻します。
ランダムな日付
vSTART_DATE から vEND_DATE までの間でランダムな日付を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | DECLARE vSTART_DATE VARCHAR2(8) := '20140401' ; vEND_DATE VARCHAR2(8) := '20150331' ; vDATE_FORMAT VARCHAR2(8) := 'YYYYMMDD' ; vRANDOM DATE ; BEGIN vRANDOM := TO_DATE(vSTART_DATE, vDATE_FORMAT) + FLOOR( DBMS_RANDOM.VALUE( 0, TO_DATE(vEND_DATE, vDATE_FORMAT) - TO_DATE(vSTART_DATE, vDATE_FORMAT) ) ); DBMS_OUTPUT.put_line(vRANDOM); END ; / |
文字列結合
文字列結合は CONCAT を利用した方法と パイプ(||) を利用した方法があります。
1 2 3 4 5 6 7 8 9 10 11 12 | DECLARE vSTRING VARCHAR2(10); BEGIN -- CONCAT を利用した結合 vSTRING := CONCAT( 'abc' , 'def' ); DBMS_OUTPUT.put_line(vSTRING); -- パイプ(||) を利用した結合 vSTRING := 'ghi' || 'jkl' ; DBMS_OUTPUT.put_line(vSTRING); END ; / |
参考記事
- ORACLE - DBMS_RANDOM
- SHIFT THE ORACLE - CONCAT
- 忘れっぽいエンジニアのオラクルSQLリファレンス - ランダムな数値や文字列を取得する( DBMS_RANDOM )
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!