SQLのパフォーマンス計測を行うために、テストデータを大量に作成したい場合はよくあると思いますが、ランダム関数を使用して大量にデータを作成するPL/SQLサンプルを紹介します。
テストデータ自動生成 サンプルPL/SQL
DECLARE
TYPE typeListInt IS TABLE OF VARCHAR2(5 CHAR) INDEX BY BINARY_INTEGER;
DataList typeListInt;
wkID NUMBER(9);
wkCD NUMBER(2);
wkDATA VARCHAR2(10 CHAR);
BEGIN
----------------------------------------------
-- ランダム文字列の初期化
----------------------------------------------
DataList(0) := 'あああ';
DataList(1) := 'いいい';
DataList(2) := 'ううう';
DataList(3) := 'えええ';
DataList(4) := 'おおお';
----------------------------------------------
-- 100万レコードのデータを作成
----------------------------------------------
FOR i IN 1..1000000 LOOP
----------------------------------------------
-- 1からの連番を生成
----------------------------------------------
wkID := TO_NUMBER(i);
----------------------------------------------
-- コード値を生成
----------------------------------------------
wkCD := CEIL(DBMS_RANDOM.VALUE(0,4));
----------------------------------------------
-- ランダム文字列を生成
----------------------------------------------
wkDATA := DataList(wkCD) || TO_MULTI_BYTE(LPAD(wkCD,7,'0'));
----------------------------------------------
-- ランダム関数で自動生成したデータをインサート
----------------------------------------------
INSERT INTO TB_DATA (ID,CD,DATA) VALUES(wkID,wkCD,wkDATA);
----------------------------------------------
-- 1万件毎にコミット(ロールバックセグメントを圧迫させないためにコミット)
----------------------------------------------
IF (MOD(i,10000) = 0) THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/
テストデータ自動生成 サンプルPL/SQL 実行結果
下記の様なテストデータを自動で生成できます。件数が多いので10件だけ表示します。
SELECT
Y.ID, Y.CD, Y.DATA
FROM
(
SELECT
X.ID, X.CD, X.DATA
FROM
TB_DATA X
ORDER BY
X.ID
) Y
WHERE
ROWNUM <= 10
;
ID CD DATA
---------- ---------- --------------------
1 4 おおお0000001
2 4 おおお0000002
3 2 ううう0000003
4 1 いいい0000004
5 4 おおお0000005
6 3 えええ0000006
7 1 いいい0000007
8 4 おおお0000008
9 2 ううう0000009
10 4 おおお0000010
シンプルなPL/SQLになっていますので、これを雛形にして自分なりにカスタマイズしてもらえれば幸いです。
1件ずつINSERTする部分は少しいけていなと思いますが、もう少し改善したものは次回に紹介したいと思います。
