PL/SQL で 大量 テストデータ を 投入 する サンプルコード

0 件のコメント

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;
/

参考記事