MENU
👇しうが厳選・おすすめのブログ!
しう
【テニス好きブロガー】 
テニス、読書が好きです。IT企業で学んだこともブログに書いています。高校教諭(テニス部顧問)→IT企業。テニス歴12年。人生をより有意義なものにしたいと思い、ブログを書き始めました。Twitterもしています。
アーカイブ

Oracle DB でINSERT文をまとめてする方法【しうの備忘録】

Oracle DB でINSERT文をまとめてする方法

Oracle Database(以下Oracle DB)は世界でもトップクラスのシェアを誇るDBです。

 

今回は、Oracle DBでのINSERT ALLやINSERT FIRSTについてご紹介します。

 

INSERT文ではまとめて実行することが可能です。

その方法について見ていきましょう!

 

記事の信頼性:未経験からIT企業の受託企業へ転職に成功。現役プログラマーの「しう」がOracle DBのINSERT ALL INSERT FIRST について書いています。

目次

マルチテーブルINSERT

Oracle DB  INSERT文 まとめて

マルチテーブルINSERTを使うと複数の表へ、まとめて行を追加することができます!

 

わざわざ、同じINSERT文を何度も書くのは不便ですよね。

そんな時に役立つSQL文になります。

 

しう

副問い合わせが戻す複数の行を、まとめて複数の表に追加できるから便利やねん!

マルチテーブルINSERTの構文

マルチテーブルINSERTを使うと複数の表へ、まとめて行を追加することができます!

 

INSERT ALL
 INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
SELECT ・・・

 

また、条件をつけたい場合のマルチテーブルINSERTの構文は次のようになります。

 

INSERT [ ALL | FIRST ]

WHEN <条件>
THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]

[WHEN <条件>
THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)] ]

・・・

[ELSE INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]]
SELECT ・・・

(本来改行は必要ありませんが、見にくかったので入れています。)

 

条件つきの場合は、INSERT ALLとINSERT FIRSTの2種類があります。

 

その違いについてもこの後見ていきます!

 

PC好きな一郎君

なんか構文が長すぎてわからないよぉ

しう

最初はややこしく感じるやんな~

 

しう

慣れてきたら使い方もわかるから一緒に見ていこか!

無条件INSERT

無条件INSERTでは、INTOで指定したすべてのテーブルにINSERTされます!

 

INSERT ALL
 INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]
SELECT ・・・

 

具体的には、次のようにするとまとめてINSERTをおこなうことができます。

 

初めにt0テーブル、s1、s2テーブルの構造を確認します。

 

t0テーブルの1,2列目がs1テーブルと、t0テーブルの1,3列目がs2テーブルと同じ形になっています。

 

t0テーブルのデータを確認すると次のようになります。

 

ここでマルチテーブルINSERTを利用して、s1、s2テーブルにまとめて行の追加を行います!

 

利用するコードは

INSERT ALL
--どのテーブルのどの行に追加するか
    INTO s1 VALUES(n, s1)
    INTO s2 VALUES(n, s2)
--どのテーブルのどの列から追加するか
    SELECT n, s1, s2 FROM t0;

です。

 

この無条件INSERT文を利用することで

 

S1テーブルには

 

S2テーブルには

のようにデータが入ります。

 

列数が異なる場合も列を指定することで、別々のテーブルに代入できることが確認できましたね!

条件付きINSERT FIRST

条件付きINSERT FIRSTでは、INTOで指定したテーブルに条件に当てはまる最初のWHEN句に行がINSERTされます!

 

INSERT FIRST

 WHEN <条件1>
 THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]

・・・
ELSE INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]

SELECT ・・・

(ここも改行は必要ないですが、見やすさのために入れています。)

 

具体的には、次のようにするとまとめてINSERT FIRSTをおこなうことができます。

 

利用するテーブルは先ほどと同じ、t0、s1、s2テーブルに加えて、s1、s2テーブルと同じ構造のs3、s4テーブルとします。

t0テーブル

 

ここで、INSERT FIRSTを利用してまとめて行の追加をおこないます。

 

利用するコードは

INSERT FIRST
 --① 初めにここの条件をチェック
 WHEN n<= 1 THEN
  INTO s1 VALUES(n, s1)
  INTO s2 VALUES(n, s2)
--② ①の条件に当てはまらなければ、②の条件をチェック
 WHEN n<= 2 THEN
  INTO s3 VALUES(n, s1)
  INTO s4 VALUES(n, s2)
-- 追加する行を選択
SELECT n, s1, s2 FROM t0;

になります。

 

s1~s4までのテーブルを確認すると、次のようになります。

 

初めにWHEN n <= 1のチェックをして、当てはまらなかった場合n <= 2のチェックに移っているのが確認できます。

 

n=1 の条件は、2つ目のWHENの n<=2 にも当てはまっていますが、n<=1 の条件を先に満たすので n<=2 の時には無視している点に注意してください。

条件付きINSERT ALL

条件付きINSERT ALLでは、INTOで指定したテーブルに条件に当てはまるWHEN句に行がINSERTされます!

 

INSERT ALL

 WHEN <条件1>
 THEN INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]

・・・

ELSE INTO <テーブル名> VALUES (・・・)
[ INTO <テーブル名> VALUES (・・・)]

SELECT ・・・

(ここも改行は必要ないですが、見やすさのために入れています。)

 

先ほどのINSERT FIRSTと異なる部分は、2番目以降のWHEN句の条件に当てはまれば、1番目のWHEN句で当てはまっていても行の追加が行われることです。

 

具体的には、次のようになります。

INSERT ALL
 --①初めにここの条件をチェック
 WHEN n<= 1 THEN
  INTO s1 VALUES(n, s1)
  INTO s2 VALUES(n, s2)
--② ①の条件に関係なく、②の条件をチェック
 WHEN n<= 2 THEN
  INTO s3 VALUES(n, s1)
  INTO s4 VALUES(n, s2)
SELECT n, s1, s2 FROM t0;

  

s1~s4までのテーブルを確認すると次のようになります。

 

先ほどの、INSERT FIRSTと違う点はs3、s4のテーブルです。

 

INSERT FIRSTの場合、n = 1の s1 = ‘A’、s2 = ‘あ’ はs3、s4テーブルには追加されていませんでした。

しかし、INSERST ALLの場合は、n = 1の s1 = ‘A’、s2 = ‘あ’ もs3、s4テーブルに追加されています。

 

つまり WHEN n <= 2の条件に当てはまるのであれば、 WHEN n <= 1の条件に関係なく行の追加がされるということです。

 

この部分がややこしいので気をつけるようにしましょう。

マルチテーブルINSERTの注意点

Oracle DB  INSERT文 まとめて

マルチテーブルINSERTで行を追加できるのは表のみになります。

 

ビューやリモート表(別のOracle DBにある表)には追加できません。

その部分に注意して使うようにしましょう。

まとめ

いかがでしたか?

 

今回は、Oracle DBのINSERT文について

 

  • マルチテーブルINSERT
  • マルチテーブルINSERTの注意点

の順番でご紹介しました!

 

ぜひ、身に付けてみてくださいね!

 

解答・解説に間違いがあれば、お手数ですが下にあるコメントもしくはtwitterよりご連絡ください。

 

☟あわせて読みたい 「しう」のオススメブログ

あわせて読みたい
プログラミングを使ったおすすめの副業【知識を活かして稼ぎたい】 2018年1月から政府は副業を解禁しました。副業でどのようにお金を稼ぐのか興味のある方は多いのではないでしょうか?そこで、今回はプログラミングでおすすめの副業につ...
あわせて読みたい
Oracle DB でのSELECT文の使い方【しうの備忘録】 Oracle Database(以下Oracle DB)は世界でもトップクラスのシェアを誇るDBです。   今回は、そのOracle DBでのSELECT文についてご紹介します。   SQL文の知識は他のDB...
プログラミング(Java・Kotlin)のお...
Udemy Javaのおすすめ講座【初心者向け・6選】 | プログラミング(Java・Kotlin)のお悩み解決ラボ! 今回はUdemyでJavaの初心者向けにおすすめ講座をまとめました!Udemyでは実際に動画を見ながら環境構築もできるのでおすすめです。ハンズオンで(自分の手を動かしながら)...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

【しう】
Java Engineer| 最近はKotlin| 「テニスとJava(プログラミング)のお悩み解決ラボ」運営者| プログラミング・開発現場の学びを主に発信|【経歴】受託系IT企業➪自社開発企業| ∮保有資格∮ : Java Silver,Oracle SQL Silver,基本情報,TOEIC 750,簿記3級

コメント

コメント一覧 (2件)

  • ということは、INSERT FIRSTは先に条件を満たしたものsourceテーブルにある場合はそれ以降のWHENではINSERTされないということですね。
    挙動としてはcase文ではなく、for 文に入っているcaseまたは if 文に近いという事でしょうかね。
    for(row in rows){
    if(condition){insert row into xxxx}
    if else (condition){insert row into xxxx}
    else (condition){insert row into xxxx}
    }

    • コメントに書いていただいてる内容であっているかと思います!
      for文の中に入っているif文という(INSERT FIRSTの)例はわかりやすいですね。
      書いていただいている例のように一つ目のif文の条件に当てはまれば2つ目以降のif文の条件は関係ないという認識であっています!

コメントする

CAPTCHA


目次