Oracle データベース に 大量のテストデータ を PL/SQL を利用して投入する サンプルコード と 関連する内容 をまとめました。
目次
データ投入 の 基本形
本来なら INSERT だけでいいところなのですが… SELECT, UPDATE, DELETE も念のため組み込んだ サンプルコード を作ってみました。
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; /
シーケンスの取得
DECLARE vUserID NUMBER; BEGIN vUserID := DEMO_USERS_SEQ.nextval; DBMS_OUTPUT.put_line(vUserID); END; /
ランダムな値の取得
ランダムな数値 (乱数)
vMIN から vMAX の乱数を取得します。 DBMS_RANDOM.VALUE の結果は少数を含むため 四捨五入 ( 0.5 を足して FLOOR ) しています。
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 (文字列長) を指定できます。
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 までの間でランダムな日付を取得します。
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 を利用した方法と パイプ(||) を利用した方法があります。
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 の フォロー」 お願いします!!