まず、私は Oracle の初心者なので、私の質問はばかげているかもしれません。しかし、私は明確にしようとします。
更新したいテーブルがいくつかあります。それぞれが同じ構造を持っています: 最初の特別な列、次にn
列、そして最後にn
列で、何らかの形で前のものを反映しn
ます。(したがって、テーブルには 2×n+1 列があります)。n の値はテーブルごとに異なることに注意してください。
たとえば、 table のTABLE_A
場合、次の名前付き列があります。
COL_A_0, COL_A_1, COL_A_2, ..., COL_A_n, COL_A_1_bis, COL_A_2_bis, ..., COL_A_n_bis
今、私がやりたいことは、そのようなことです。私は 2 つの (決定論的) 関数f
とを持っていg
ます。私は次のことをしたい:
UPDATE TABLE_A SET
COL_1_bis = f(g(COL_A_0), COL_A_1),
COL_2_bis = f(g(COL_A_0), COL_A_2),
...,
COL_n_bis = f(g(COL_A_0), COL_A_n);
ポイントは、計算g(COL_A_0)
が非常に遅いことです。更新する必要がある各列 (すべての列) に対して再計算することは避けたいと思いbis
ます。g(COL_A_0)
の値は行ごとに変わることに注意してください。さらに、同じ数の列を持つすべてのテーブルではなく、いくつかのテーブルに前のスキームを適用したいと考えています。たとえば、TABLE_A
2×3+1 の列TABLE_B
があり、2×5+1 の列があります。
g(COL_A_0)
私が思いついた最初のアイデアは、最初に の値を 1 回だけ計算し、次に計算された文字列を計算することによって、コマンドを文字列で生成することでしたEXECUTE IMMEDIATE
。g(COL_A_0)
ただし、行ごとに の値が変化するため、機能しません。
完璧なものは、次のようなものを書くことができるでしょう:
UPDATE TABLE_A SET
(COL_1_bis, ..., COL_n_bis) = map(f, g(COL_A_0), (COL_A_1, ..., COL_A_n));
これほどシンプルなものに、エレガントで効率的なソリューションがないことは想像できません。私にはよくあるパターンのように思えます。