- 締切済み
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のカラムを更新したいのですが どのように作成したらいいのか教えてください。お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
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側の負担は少ないと思います。