プログラミングBlog

プログラミング学習用

ちょいちょい書いてます

OracleDB 大量のデータ作成

OracleDB 大量のデータ作成

テーブル作成

CREATE TABLE test(
    id number(10),
    name varchar(10),
    code varchar(5),
    mail varchar(255)
)

ランダムな数値作成

1-9999までの数値 + 浮動小数点を返す。 DBMS_RANDOM.VALUE(1,9999)
結果:1366.243219707729031003322765651467096256
小数点は必要ないのでTRUNCで切ります。
TRUNC(DBMS_RANDOM.VALUE (1, 9999), 0)
ランダムな数値の生成完成。

ランダムな文字列を作成

今回は大文字のアルファベット生成と数字を生成。
第一引数はルールごとに記述が違うのでその都度変更していく。
DBMS_RANDOM.STRING('x', 8) || '@co.jp'
結果:336L0ZGR@co.jp
ランダムな文字列の完成。

参考サイト

oracle.se-free.com

データをINSERT

一件のデータを挿入。

INSERT 
INTO test 
VALUES ( 
    TRUNC(DBMS_RANDOM.VALUE (1, 9999), 0)
    , 'test'
    , DBMS_RANDOM.STRING('x', 5)
    , DBMS_RANDOM.STRING('x', 8) || '@co.jp'
); 

ランダムなデータ。

結果:   ID:8183        NAME:test     CODE:HSABS       MAIL:48PQFKAV@co.jp

100件のデータをINSERT

BEGIN FOR i IN 1..100 LOOP 
INSERT 
INTO test 
VALUES ( 
    TRUNC(DBMS_RANDOM.VALUE (1, 9999), 0)
    , 'test'
    , DBMS_RANDOM.STRING('x', 5)
    , DBMS_RANDOM.STRING('x', 8) || '@co.jp'
); 

END LOOP; 

END;

エラー発生。
f:id:Tokuty:20210211114154p:plain
このエラーに1時間ほど悩まされました。
まず考えたのが 3つほど。

  1. シンプルに記述ミス。
  2. BEGIN ENDFOR LOOP END LOOP等、閉じる位置が対応していない可能性。
  3. プロシージャ権限関係。

結果的にどれも違いました 笑
でも勉強になったので良かったかな。
解決方法としてはSQLの実行オプションでギャレットの位置を";"→"/"に変更すれば読み込んでくれるようです。(参考サイト


再実行結果
f:id:Tokuty:20210211115045p:plain

解決方法の参考サイト

A5:SQL Mk-2でストアドプロシージャがエラーになるときの解決方法 | 25歳でフリーランス28歳で起業したエンジニア -じゃけぇ- のあれこれ
助かりました!ありがとうございます。

ショートカットキー

A5の機能についてもっと知っていればエラー解決できたはず。
ツールには慣れていきたいので、今回使った役に立つショートカットキーを残しておきます。
* CTRL + K コメントアウト
* CTRL + SHIFT + K コメントアウト解除
* CTRL + Q SQLの整形
SQLの整形は記述はあってるけど読み込んでくれない時などによく使います。