【Oracle】ランダムなテストデータを作ってみよう!(顧客データ)

Oracle

今回は、SQLでランダムなテストデータを作ってみようということで、顧客データを想定してサンプルコードを作成してみました。

ランダムなテストデータを作ってみよう!

顧客テーブルの作成

-- 顧客テーブルの作成
CREATE TABLE customers (
    customer_id NUMBER PRIMARY KEY,   -- 顧客ID (プライマリキー)
    first_name VARCHAR2(50),   -- 名
    last_name VARCHAR2(50),   -- 姓
    email VARCHAR2(100),    -- メールアドレス
    phone VARCHAR2(15),   -- 電話番号
    address VARCHAR2(200),    -- 住所
    city VARCHAR2(100),   -- 都市
    postal_code VARCHAR2(10)   -- 郵便番号
);

文字列を区切り文字で分割する関数

-- 文字列を区切り文字で分割し、リストとして返す関数の作成
CREATE OR REPLACE FUNCTION split_string(
    p_string IN VARCHAR2,   -- 分割対象の文字列
    p_delimiter IN VARCHAR2 := ','    -- 区切り文字 (デフォルトはカンマ)
) RETURN SYS.ODCIVARCHAR2LIST IS
    l_string VARCHAR2(32767) := p_string || p_delimiter;   -- 区切り文字を追加
    l_list SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();   -- 結果リストの初期化
    l_pos PLS_INTEGER;   -- 区切り文字の位置
    l_index PLS_INTEGER := 1;   -- 現在の位置
BEGIN
    LOOP
        l_pos := INSTR(l_string, p_delimiter, l_index);   -- 次の区切り文字の位置を取得
        EXIT WHEN l_pos = 0;   -- 区切り文字が見つからない場合、ループを終了
        l_list.EXTEND;  -- リストのサイズを1つ拡張
        l_list(l_list.COUNT) := SUBSTR(l_string, l_index, l_pos - l_index);   -- 区切り文字までの部分文字列をリストに追加
        l_index := l_pos + LENGTH(p_delimiter);  -- 次の開始位置を設定
    END LOOP;
    RETURN l_list;  -- 結果リストを返す
END;

ランダムなデータの作成

-- ランダムな名前を取得する関数の作成
CREATE OR REPLACE FUNCTION get_random_first_name RETURN VARCHAR2 IS
    first_names SYS.ODCIVARCHAR2LIST := split_string('Taro,Jiro,Hanako,Kenichi,Mayumi,Sachiko,Ichiro,Jiro,Yoshi,Saburo');
BEGIN
    RETURN first_names(TRUNC(DBMS_RANDOM.VALUE(1, first_names.COUNT + 1)));  -- ランダムに選ばれた名前を返す
END;

-- ランダムな苗字を取得する関数の作成
CREATE OR REPLACE FUNCTION get_random_last_name RETURN VARCHAR2 IS
    last_names SYS.ODCIVARCHAR2LIST := split_string('Sato,Suzuki,Takahashi,Tanaka,Ito,Watanabe,Yamamoto,Nakamura,Kobayashi,Kato');
BEGIN
    RETURN last_names(TRUNC(DBMS_RANDOM.VALUE(1, last_names.COUNT + 1)));  -- ランダムに選ばれた苗字を返す
END;

-- ランダムなメールアドレスを生成する関数の作成
CREATE OR REPLACE FUNCTION get_random_email(
    p_first_name VARCHAR2,
    p_last_name VARCHAR2
) RETURN VARCHAR2 IS
BEGIN
    RETURN LOWER(p_first_name || '.' || p_last_name || '@gmail.com');
END;

-- ランダムな電話番号を生成する関数の作成
CREATE OR REPLACE FUNCTION get_random_phone RETURN VARCHAR2 IS
BEGIN
    RETURN '080' || TO_CHAR(TRUNC(DBMS_RANDOM.VALUE(10000000, 99999999)));  -- ランダムな電話番号を返す
END;

-- ランダムな住所を生成する関数の作成
CREATE OR REPLACE FUNCTION get_random_address RETURN VARCHAR2 IS
    streets SYS.ODCIVARCHAR2LIST := split_string('中央区,新宿区,渋谷区,品川区,港区,世田谷区,目黒区,江東区,杉並区,大田区');
BEGIN
    RETURN streets(TRUNC(DBMS_RANDOM.VALUE(1, streets.COUNT + 1))) || TRUNC(DBMS_RANDOM.VALUE(1, 9)) || '丁目';  -- ランダムな住所を返す
END;

-- ランダムな都市名を取得する関数の作成
CREATE OR REPLACE FUNCTION get_random_city RETURN VARCHAR2 IS
    cities SYS.ODCIVARCHAR2LIST := split_string('東京都');
BEGIN
    RETURN cities(TRUNC(DBMS_RANDOM.VALUE(1, cities.COUNT + 1)));  -- ランダムな都市名を返す
END;

-- ランダムな郵便番号を生成する関数の作成
CREATE OR REPLACE FUNCTION get_random_postal_code RETURN VARCHAR2 IS
BEGIN
    -- 最初の3文字を100に固定し、残りの4文字をランダムに生成
    RETURN '100' || TO_CHAR(TRUNC(DBMS_RANDOM.VALUE(1000, 9999)), 'FM0000');
END;

ランダムなデータをテーブルに追加

-- ランダムなデータをテーブルに追加
BEGIN
    FOR i IN 1..50 LOOP  -- 50件のデータを追加
        DECLARE
            v_first_name VARCHAR2(50);
            v_last_name VARCHAR2(50);
        BEGIN
            -- ランダムな名前を取得
            v_first_name := get_random_first_name();
            v_last_name := get_random_last_name();
            -- データを挿入
            INSERT INTO customers (
                customer_id,  -- 顧客ID
                first_name,  -- 名
                last_name,   -- 姓
                email,  -- メールアドレス
                phone,  -- 電話番号
                address,  -- 住所
                city,   -- 都市
                postal_code   -- 郵便番号
            ) VALUES (
                i,  -- インデックスを顧客IDとして使用
                v_first_name,  -- ランダムな名
                v_last_name,   -- ランダムな姓
                get_random_email(v_first_name, v_last_name),  -- ランダムなメールアドレスを生成
                get_random_phone(),       -- ランダムな電話番号を生成
                get_random_address(),     -- ランダムな住所を生成
                get_random_city(),        -- ランダムな都市名を取得
                get_random_postal_code()  -- ランダムな郵便番号を生成
            );
        END;
    END LOOP;
    COMMIT;  -- トランザクションをコミット
END;

作成したデータを確認

SELECT
  customer_id AS "顧客ID ",
  first_name AS "名",
  last_name AS "性",
  email AS "メールアドレス",
  -- 電話番号 xxx-xxxx-xxxx
  SUBSTR(phone, 1, 3) || '-' || SUBSTR(phone, 4, 4) || '-' || SUBSTR(phone, 8, 4) AS "電話番号",
  address AS "住所",
  city AS "都市",
  -- 郵便番号 xxx-xxxx 
  SUBSTR(postal_code, 1, 3) || '-' || SUBSTR(postal_code, 4, 4) AS "郵便番号"
FROM
  customers;
顧客IDメールアドレス電話番号住所都市郵便番号
1IchiroKatoichiro.kato@gmail.com080-3357-8554世田谷区8丁目東京都100-3838
2TaroItotaro.ito@gmail.com080-9812-8470中央区2丁目東京都100-3785
3MayumiYamamotomayumi.yamamoto@gmail.com080-8138-1289目黒区1丁目東京都100-7587
4MayumiTakahashimayumi.takahashi@gmail.com080-2012-8393大田区3丁目東京都100-7116
5HanakoSatohanako.sato@gmail.com080-1277-8784中央区1丁目東京都100-7767
6JiroSuzukijiro.suzuki@gmail.com080-2666-9747中央区1丁目東京都100-1970
7KenichiSuzukikenichi.suzuki@gmail.com080-7716-8979世田谷区7丁目東京都100-9672
8KenichiTakahashikenichi.takahashi@gmail.com080-4808-2035目黒区8丁目東京都100-6385
9JiroSuzukijiro.suzuki@gmail.com080-3472-9253新宿区3丁目東京都100-1586
10MayumiNakamuramayumi.nakamura@gmail.com080-7859-0442杉並区2丁目東京都100-6308
11JiroYamamotojiro.yamamoto@gmail.com080-7955-4732品川区2丁目東京都100-9936
12TaroItotaro.ito@gmail.com080-9523-8060目黒区2丁目東京都100-9006
13TaroKobayashitaro.kobayashi@gmail.com080-6784-8229渋谷区8丁目東京都100-8712
14MayumiWatanabemayumi.watanabe@gmail.com080-2465-5909世田谷区6丁目東京都100-3271
15HanakoTakahashihanako.takahashi@gmail.com080-2538-2061世田谷区1丁目東京都100-7629
16MayumiKatomayumi.kato@gmail.com080-6862-0837中央区3丁目東京都100-8003
17HanakoTanakahanako.tanaka@gmail.com080-1047-8056品川区2丁目東京都100-7206
18JiroNakamurajiro.nakamura@gmail.com080-7802-2907目黒区1丁目東京都100-3807
19KenichiYamamotokenichi.yamamoto@gmail.com080-6751-0487港区6丁目東京都100-7057
20MayumiYamamotomayumi.yamamoto@gmail.com080-4129-7110目黒区1丁目東京都100-2364
21JiroSuzukijiro.suzuki@gmail.com080-9940-8545渋谷区4丁目東京都100-9053
22JiroKobayashijiro.kobayashi@gmail.com080-3171-6913港区6丁目東京都100-9161
23HanakoKatohanako.kato@gmail.com080-8988-4452品川区4丁目東京都100-9653
24IchiroKobayashiichiro.kobayashi@gmail.com080-7897-0083江東区2丁目東京都100-9132
25KenichiWatanabekenichi.watanabe@gmail.com080-5942-2359港区8丁目東京都100-1125
26JiroYamamotojiro.yamamoto@gmail.com080-5801-5894江東区5丁目東京都100-7717
27KenichiYamamotokenichi.yamamoto@gmail.com080-4625-1719大田区1丁目東京都100-8039
28TaroNakamurataro.nakamura@gmail.com080-6088-8089目黒区3丁目東京都100-9399
29MayumiSuzukimayumi.suzuki@gmail.com080-2522-0858江東区4丁目東京都100-2714
30JiroKatojiro.kato@gmail.com080-4824-7122杉並区6丁目東京都100-1542
31SachikoItosachiko.ito@gmail.com080-1757-1156目黒区1丁目東京都100-6468
32SaburoTanakasaburo.tanaka@gmail.com080-5741-0538渋谷区7丁目東京都100-1065
33SaburoItosaburo.ito@gmail.com080-4215-0289品川区7丁目東京都100-9816
34TaroKatotaro.kato@gmail.com080-9850-8220品川区4丁目東京都100-2385
35HanakoKobayashihanako.kobayashi@gmail.com080-1422-9063目黒区1丁目東京都100-7696
36JiroKatojiro.kato@gmail.com080-3096-5509渋谷区2丁目東京都100-7387
37SaburoYamamotosaburo.yamamoto@gmail.com080-8142-8783品川区8丁目東京都100-1727
38JiroYamamotojiro.yamamoto@gmail.com080-8488-0570目黒区4丁目東京都100-9436
39SaburoTakahashisaburo.takahashi@gmail.com080-8516-0166渋谷区2丁目東京都100-5838
40KenichiTanakakenichi.tanaka@gmail.com080-1327-4811世田谷区4丁目東京都100-2459
41JiroKobayashijiro.kobayashi@gmail.com080-1212-9302江東区7丁目東京都100-4044
42YoshiWatanabeyoshi.watanabe@gmail.com080-5242-0975渋谷区7丁目東京都100-9340
43HanakoSatohanako.sato@gmail.com080-6149-8973大田区1丁目東京都100-1387
44JiroKobayashijiro.kobayashi@gmail.com080-8173-3168世田谷区7丁目東京都100-6082
45TaroSatotaro.sato@gmail.com080-5262-9211目黒区3丁目東京都100-5483
46MayumiYamamotomayumi.yamamoto@gmail.com080-9924-1400品川区5丁目東京都100-2107
47TaroKobayashitaro.kobayashi@gmail.com080-3010-2647港区6丁目東京都100-3237
48SachikoYamamotosachiko.yamamoto@gmail.com080-6750-2168世田谷区2丁目東京都100-3569
49IchiroNakamuraichiro.nakamura@gmail.com080-4024-8770杉並区7丁目東京都100-5606
50YoshiWatanabeyoshi.watanabe@gmail.com080-7325-7223渋谷区5丁目東京都100-6112
ランダムに作成した顧客データ

まとめ

いかがでしたか?それっぽいデータが出来上がったと思います。ぜひ、サンプルコードを使って手を動かしながら色々試してみてください!

コメント

タイトルとURLをコピーしました