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;
/
参考記事