今回は、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 | 名 | 性 | メールアドレス | 電話番号 | 住所 | 都市 | 郵便番号 |
---|---|---|---|---|---|---|---|
1 | Ichiro | Kato | ichiro.kato@gmail.com | 080-3357-8554 | 世田谷区8丁目 | 東京都 | 100-3838 |
2 | Taro | Ito | taro.ito@gmail.com | 080-9812-8470 | 中央区2丁目 | 東京都 | 100-3785 |
3 | Mayumi | Yamamoto | mayumi.yamamoto@gmail.com | 080-8138-1289 | 目黒区1丁目 | 東京都 | 100-7587 |
4 | Mayumi | Takahashi | mayumi.takahashi@gmail.com | 080-2012-8393 | 大田区3丁目 | 東京都 | 100-7116 |
5 | Hanako | Sato | hanako.sato@gmail.com | 080-1277-8784 | 中央区1丁目 | 東京都 | 100-7767 |
6 | Jiro | Suzuki | jiro.suzuki@gmail.com | 080-2666-9747 | 中央区1丁目 | 東京都 | 100-1970 |
7 | Kenichi | Suzuki | kenichi.suzuki@gmail.com | 080-7716-8979 | 世田谷区7丁目 | 東京都 | 100-9672 |
8 | Kenichi | Takahashi | kenichi.takahashi@gmail.com | 080-4808-2035 | 目黒区8丁目 | 東京都 | 100-6385 |
9 | Jiro | Suzuki | jiro.suzuki@gmail.com | 080-3472-9253 | 新宿区3丁目 | 東京都 | 100-1586 |
10 | Mayumi | Nakamura | mayumi.nakamura@gmail.com | 080-7859-0442 | 杉並区2丁目 | 東京都 | 100-6308 |
11 | Jiro | Yamamoto | jiro.yamamoto@gmail.com | 080-7955-4732 | 品川区2丁目 | 東京都 | 100-9936 |
12 | Taro | Ito | taro.ito@gmail.com | 080-9523-8060 | 目黒区2丁目 | 東京都 | 100-9006 |
13 | Taro | Kobayashi | taro.kobayashi@gmail.com | 080-6784-8229 | 渋谷区8丁目 | 東京都 | 100-8712 |
14 | Mayumi | Watanabe | mayumi.watanabe@gmail.com | 080-2465-5909 | 世田谷区6丁目 | 東京都 | 100-3271 |
15 | Hanako | Takahashi | hanako.takahashi@gmail.com | 080-2538-2061 | 世田谷区1丁目 | 東京都 | 100-7629 |
16 | Mayumi | Kato | mayumi.kato@gmail.com | 080-6862-0837 | 中央区3丁目 | 東京都 | 100-8003 |
17 | Hanako | Tanaka | hanako.tanaka@gmail.com | 080-1047-8056 | 品川区2丁目 | 東京都 | 100-7206 |
18 | Jiro | Nakamura | jiro.nakamura@gmail.com | 080-7802-2907 | 目黒区1丁目 | 東京都 | 100-3807 |
19 | Kenichi | Yamamoto | kenichi.yamamoto@gmail.com | 080-6751-0487 | 港区6丁目 | 東京都 | 100-7057 |
20 | Mayumi | Yamamoto | mayumi.yamamoto@gmail.com | 080-4129-7110 | 目黒区1丁目 | 東京都 | 100-2364 |
21 | Jiro | Suzuki | jiro.suzuki@gmail.com | 080-9940-8545 | 渋谷区4丁目 | 東京都 | 100-9053 |
22 | Jiro | Kobayashi | jiro.kobayashi@gmail.com | 080-3171-6913 | 港区6丁目 | 東京都 | 100-9161 |
23 | Hanako | Kato | hanako.kato@gmail.com | 080-8988-4452 | 品川区4丁目 | 東京都 | 100-9653 |
24 | Ichiro | Kobayashi | ichiro.kobayashi@gmail.com | 080-7897-0083 | 江東区2丁目 | 東京都 | 100-9132 |
25 | Kenichi | Watanabe | kenichi.watanabe@gmail.com | 080-5942-2359 | 港区8丁目 | 東京都 | 100-1125 |
26 | Jiro | Yamamoto | jiro.yamamoto@gmail.com | 080-5801-5894 | 江東区5丁目 | 東京都 | 100-7717 |
27 | Kenichi | Yamamoto | kenichi.yamamoto@gmail.com | 080-4625-1719 | 大田区1丁目 | 東京都 | 100-8039 |
28 | Taro | Nakamura | taro.nakamura@gmail.com | 080-6088-8089 | 目黒区3丁目 | 東京都 | 100-9399 |
29 | Mayumi | Suzuki | mayumi.suzuki@gmail.com | 080-2522-0858 | 江東区4丁目 | 東京都 | 100-2714 |
30 | Jiro | Kato | jiro.kato@gmail.com | 080-4824-7122 | 杉並区6丁目 | 東京都 | 100-1542 |
31 | Sachiko | Ito | sachiko.ito@gmail.com | 080-1757-1156 | 目黒区1丁目 | 東京都 | 100-6468 |
32 | Saburo | Tanaka | saburo.tanaka@gmail.com | 080-5741-0538 | 渋谷区7丁目 | 東京都 | 100-1065 |
33 | Saburo | Ito | saburo.ito@gmail.com | 080-4215-0289 | 品川区7丁目 | 東京都 | 100-9816 |
34 | Taro | Kato | taro.kato@gmail.com | 080-9850-8220 | 品川区4丁目 | 東京都 | 100-2385 |
35 | Hanako | Kobayashi | hanako.kobayashi@gmail.com | 080-1422-9063 | 目黒区1丁目 | 東京都 | 100-7696 |
36 | Jiro | Kato | jiro.kato@gmail.com | 080-3096-5509 | 渋谷区2丁目 | 東京都 | 100-7387 |
37 | Saburo | Yamamoto | saburo.yamamoto@gmail.com | 080-8142-8783 | 品川区8丁目 | 東京都 | 100-1727 |
38 | Jiro | Yamamoto | jiro.yamamoto@gmail.com | 080-8488-0570 | 目黒区4丁目 | 東京都 | 100-9436 |
39 | Saburo | Takahashi | saburo.takahashi@gmail.com | 080-8516-0166 | 渋谷区2丁目 | 東京都 | 100-5838 |
40 | Kenichi | Tanaka | kenichi.tanaka@gmail.com | 080-1327-4811 | 世田谷区4丁目 | 東京都 | 100-2459 |
41 | Jiro | Kobayashi | jiro.kobayashi@gmail.com | 080-1212-9302 | 江東区7丁目 | 東京都 | 100-4044 |
42 | Yoshi | Watanabe | yoshi.watanabe@gmail.com | 080-5242-0975 | 渋谷区7丁目 | 東京都 | 100-9340 |
43 | Hanako | Sato | hanako.sato@gmail.com | 080-6149-8973 | 大田区1丁目 | 東京都 | 100-1387 |
44 | Jiro | Kobayashi | jiro.kobayashi@gmail.com | 080-8173-3168 | 世田谷区7丁目 | 東京都 | 100-6082 |
45 | Taro | Sato | taro.sato@gmail.com | 080-5262-9211 | 目黒区3丁目 | 東京都 | 100-5483 |
46 | Mayumi | Yamamoto | mayumi.yamamoto@gmail.com | 080-9924-1400 | 品川区5丁目 | 東京都 | 100-2107 |
47 | Taro | Kobayashi | taro.kobayashi@gmail.com | 080-3010-2647 | 港区6丁目 | 東京都 | 100-3237 |
48 | Sachiko | Yamamoto | sachiko.yamamoto@gmail.com | 080-6750-2168 | 世田谷区2丁目 | 東京都 | 100-3569 |
49 | Ichiro | Nakamura | ichiro.nakamura@gmail.com | 080-4024-8770 | 杉並区7丁目 | 東京都 | 100-5606 |
50 | Yoshi | Watanabe | yoshi.watanabe@gmail.com | 080-7325-7223 | 渋谷区5丁目 | 東京都 | 100-6112 |
まとめ
いかがでしたか?それっぽいデータが出来上がったと思います。ぜひ、サンプルコードを使って手を動かしながら色々試してみてください!
コメント