まず、私は 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_A2×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));
これほどシンプルなものに、エレガントで効率的なソリューションがないことは想像できません。私にはよくあるパターンのように思えます。