回答編集履歴

1

参考情報を追加

2016/06/19 14:21

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -25,3 +25,55 @@
25
25
  > find_or_initialize_byメソッドはfind_or_create_byと同様に動作しますが、createの代りにnewを呼ぶ点が異なります。つまり、モデルの新しいインスタンスは作成されますが、その時点ではデータベースに保存されていません。
26
26
 
27
27
  > ...
28
+
29
+
30
+
31
+ 追加 2016-06-19 23:20
32
+
33
+
34
+
35
+ merge についての参考情報:
36
+
37
+ - バルク SQL を使用して複数レコードを変数に格納してからループ処理を行うサンプル [http://hensa40.cutegirl.jp/archives/1451](http://hensa40.cutegirl.jp/archives/1451)
38
+
39
+
40
+
41
+ - 単一の操作によるデータの挿入およびデータの更新 [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)
42
+
43
+ > ...
44
+
45
+ > DB2 のプログラミング
46
+
47
+ > MERGE ステートメントを使用すれば、単一の操作によって既存のデータを更新し、新規データを挿入できます。
48
+
49
+ > ...
50
+
51
+
52
+
53
+ - Oracle SQL SELECT [http://itref.fc2web.com/oracle/sql/select.html](http://itref.fc2web.com/oracle/sql/select.html)
54
+
55
+ > ...
56
+
57
+ > FOR UPDATE
58
+
59
+ > ...
60
+
61
+ > 条件に一致するレコードが表にあれば更新、なければ挿入(新規追加)する場合、普通にSELECTしてレコードが無かったらUPDATEするという方法では、SELECT時にレコードが存在してもUPDATE時にそのレコードがまだ存在している保証はない。そこで、SELECT FOR UPDATEを使うと、レコードロックがかかり、UPDATEするまで削除されない。なお、SELECT FOR UPDATEを実行した場合、コミットするまでロックされたままなので注意が必要である。Oracle 9i以降ではMERGE文を使用するのが望ましい。
62
+
63
+ > ...
64
+
65
+
66
+
67
+ - oracle 不思議な呪文MERGE [http://you-sk.hateblo.jp/entry/2015/07/10/080750](http://you-sk.hateblo.jp/entry/2015/07/10/080750)
68
+
69
+ > ...
70
+
71
+ > 「りんご」は価格更新(UPDATE)、「めろん」は新商品(INSERT)として扱いたいと思います。 テーブルを結合させた無名カーソルを用いて、旧価格が取れた(NOT NULL)なら更新、そうでなければ追加…というロジックでPL/SQLで素直にコーディングしてみました。
72
+
73
+ > ...
74
+
75
+ > これをMERGEで書き換えると…
76
+
77
+ > ...
78
+
79
+