• 締切済み

PL/SQL 複数件同じ値で更新する方法

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のカラムを更新したいのですが どのように作成したらいいのか教えてください。お願いします。

みんなの回答

回答No.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側の負担は少ないと思います。

関連するQ&A