アプリ版:「スタンプのみでお礼する」機能のリリースについて

functionを作成しています。
AAA  BBB     BBB 
==== ==== → ==== 
001  100      200
001  101       200
002  102      201
003  103      202
update TABLE_NAME set BBB = function (BBB);

のように呼び出されています。
現在はfunctionで連番がふられているため、BBBのカラムは
全て違う値に更新されてしまうのですが、
AAAで同じ値のものには同じ値を返しBBBのカラムを更新したいのですが
どのように作成したらいいのか教えてください。お願いします。

A 回答 (1件)

UPDATE一文で、一括更新する場合、更新する順番はオラクルが決めます。


また、更新の途上で、先に更新したレコードの内容は確認できません。
例えば、仮にオラクルが上から更新したとしたら、001-100で更新した値は
001-101の更新の際に、参照できません。

採番する(Function)側で、001-100に何を採番したか把握した上で、
001-101に対しても、同じ値を返す工夫が必要になります。

現在のFunctionの中身が判らないので、UPDATE一文で同様のことを
実現するとしたら、こんな感じで書けるはずです。
update TABLE_NAME Z
set
BBB
=
(
select R
from
(select AAA,rownum R from (select distinct AAA from TABLE_NAME)) X,
(select AAA,BBB from TABLE_NAME) Y
where X.AAA=Y.AAA and Y.BBB=Z.BBB
)
;
サブクエリの部分は、更新レコードのBBB項目しか参照していません。
このサブクエリの部分をFUNCTION側に移植して、採番の起点(200?)を
考慮する仕組みにすればよろしいのではないかと思います。

ちなみに、FUNCTIONのパラメータを見直せるのであれば、BBBだけでなく
AAA,BBBとする方が、FUNCTION側の負担は少ないと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!