0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

テストで1~9999の穴あきデータを埋めた備忘録(oracle)

Last updated at Posted at 2023-04-23

結合テストを行うために検証用のDBにデータを登録した。
使用DBはoracle。触ったのは初めてだったので調べながらsqlを書いた。
アプローチを誤って?時間がかかってしまったので備忘録として残す。

<結論>
・データの穴埋めを行うにはinsertにnot existを組み合わせる。
 またinsert intoの後に行うselectには固定値を入力する。

<前提条件>
・IDを1~9999全て抜けが無い状態でDBに登録する必要がある(PKで重複不可)
・他のカラムは固定値を登録する(任意の値でOK)
・本番環境からマスクデータ化して検証環境に移したデータがあるため、虫食い状態となっている。
(例えば1、2、4、5、6のように)
・既に入っているデータを消すのはNG

<最初考えたこと>
insertで1~9999全部埋めよう

→PKの重複チェックでsql実行不可。さて困った…

<誤ったアプローチ>
cursor fetchで1行ずつ存在するデータを取得して、存在していたらinsertしない
→取得まではできた。この後どうやって条件分岐を書こう・・・?
普通にロジック組めそうだけど上手く書けない悔しい

<上手くいったアプローチ>
ロジックは下記
①9999回ループを行う。オラクルではFOR i IN 1..9999 LOOP。
②DBにiの値がIDとして存在しない場合、insertを行う。
→insert intoにselectとnot existを組み合わせて行う。

組み合わせるとこんなsqlになった。
FOR i IN 1..9999 LOOP
insert into DB名 カラム1, カラム2
select i,'hoge'from dual
where not exists (select カラム1 from DB名 where カラム1 = i);
END LOOP;

→無事に1~9999が連番で存在するDBを作成することができました。

書き終わってみるととても単純な内容ですが、考えているときはすんなりと浮かばなかった。
selectで固定値を取得できることや、その内容をinsertすると便利なことを今回知ることができました:)

<参考にしたサイト様>

・オラクルでループどう書くか
https://www.shift-the-oracle.com/plsql/for-while-loop.html

・存在しない判定をどうやるか
https://oreno-it.info/archives/2401

・固定値を入れる方法
https://qiita.com/kazuhei/items/60d8366b53e6ca8ef28a

初めて書いたので、不適切な内容等ございましたら申し訳ございません。
ご指摘いただけた場合、随時確認させていただきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?