1

Oracle 10gのクエリからのレコード値を使用して、テーブル内の複数の列を簡単に/エレガントに更新する方法はありますか?

簡単にするために、2つの列とを含むテーブル(ソースと呼びます)があり IDますKEY

IDキー
---- ----
1 1000
2 1000
3 5000
4 1000
..
101 8000
102 9000
103 7000
104 9000
..。
201 5
202 5
..。

バッチ内のIDのキーマップである列を使用して、それを取得して使用する別のテーブル(と呼びますKeyMap)があります。trunc(ID/100)batchID

trunc(ID / 100)key1 key2 key3 key4 ..... key99 ..
------------- ---- ---- ---- ----
0 1000 1000 5000 1000
1 8000 9000 7000 9000
2 5 5               

IDはバッチで作成および処理されるため、バッチ処理の最後に、ストアドプロシージャを呼び出して、これらのキーを提供する副選択またはコレクションを使用して、1つの更新ステートメントでKeyMapテーブル内のレコードを新しい値で更新します。Key値。

これは可能ですか?これを行うための最良/最も効率的な方法は何ですか?

4

2 に答える 2

8

私の批判は、あなたのテーブルのデザインが正規化されておらず、あまりきれいではないと言うことに限定しますが、あなたにはあなたの理由があると思います。私は通常、これらの「ローテーション」クエリを、集約列と組み合わせたDECODEを使用して実行し、キー(この場合は疑似キー、trunc(ID / 100))でグループ化します。これを、タプルを使用する更新構文と組み合わせます。

 UPDATE Foo
    SET (a, b, c, d)
      = (w, x, y, z);

そしてあなたは得る:

  UPDATE KeyMap
     SET
       ( key1
       , key2
       , key3
       , key4
       ...
       , key99
       )
       = ( SELECT MAX(decode(mod(ID, 100), 1, Key, NULL))
                , MAX(decode(mod(ID, 100), 2, Key, NULL))
                , MAX(decode(mod(ID, 100), 3, Key, NULL))
                , MAX(decode(mod(ID, 100), 4, Key, NULL))
                ...
                , MAX(decode(mod(ID, 100), 99, Key, NULL))
             FROM Source
            WHERE Trunc(Source.ID / 100) = KeyMap.batchId
            GROUP BY Trunc(Source.ID / 100)
         )
   WHERE BatchId = <x>;
于 2009-06-16T19:33:07.763 に答える
0

Oracle VARRAYを生成し、キーをバッチで渡すことができます。手順はVARRAYを反復処理し、テーブルを更新する可能性があります。

于 2009-06-16T19:01:43.447 に答える