teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

参考情報を追加

2016/06/19 14:21

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -11,4 +11,29 @@
11
11
  > COMMIT
12
12
  > ...
13
13
  > find_or_initialize_byメソッドはfind_or_create_byと同様に動作しますが、createの代りにnewを呼ぶ点が異なります。つまり、モデルの新しいインスタンスは作成されますが、その時点ではデータベースに保存されていません。
14
- > ...
14
+ > ...
15
+
16
+ 追加 2016-06-19 23:20
17
+
18
+ merge についての参考情報:
19
+ - バルク SQL を使用して複数レコードを変数に格納してからループ処理を行うサンプル [http://hensa40.cutegirl.jp/archives/1451](http://hensa40.cutegirl.jp/archives/1451)
20
+
21
+ - 単一の操作によるデータの挿入およびデータの更新 [http://www.ibm.com/support/knowledgecenter/ja/SSEPEK_11.0.0/com.ibm.db2z11.doc.apsg/src/tpc/db2z_insertupdateoperation.html](http://www.ibm.com/support/knowledgecenter/ja/SSEPEK_11.0.0/com.ibm.db2z11.doc.apsg/src/tpc/db2z_insertupdateoperation.html)
22
+ > ...
23
+ > DB2 のプログラミング
24
+ > MERGE ステートメントを使用すれば、単一の操作によって既存のデータを更新し、新規データを挿入できます。
25
+ > ...
26
+
27
+ - Oracle SQL SELECT [http://itref.fc2web.com/oracle/sql/select.html](http://itref.fc2web.com/oracle/sql/select.html)
28
+ > ...
29
+ > FOR UPDATE
30
+ > ...
31
+ > 条件に一致するレコードが表にあれば更新、なければ挿入(新規追加)する場合、普通にSELECTしてレコードが無かったらUPDATEするという方法では、SELECT時にレコードが存在してもUPDATE時にそのレコードがまだ存在している保証はない。そこで、SELECT FOR UPDATEを使うと、レコードロックがかかり、UPDATEするまで削除されない。なお、SELECT FOR UPDATEを実行した場合、コミットするまでロックされたままなので注意が必要である。Oracle 9i以降ではMERGE文を使用するのが望ましい。
32
+ > ...
33
+
34
+ - oracle 不思議な呪文MERGE [http://you-sk.hateblo.jp/entry/2015/07/10/080750](http://you-sk.hateblo.jp/entry/2015/07/10/080750)
35
+ > ...
36
+ > 「りんご」は価格更新(UPDATE)、「めろん」は新商品(INSERT)として扱いたいと思います。 テーブルを結合させた無名カーソルを用いて、旧価格が取れた(NOT NULL)なら更新、そうでなければ追加…というロジックでPL/SQLで素直にコーディングしてみました。
37
+ > ...
38
+ > これをMERGEで書き換えると…
39
+ > ...