1

まず、私は 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 IMMEDIATEg(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));

これほどシンプルなものに、エレガントで効率的なソリューションがないことは想像できません。私にはよくあるパターンのように思えます。

4

1 に答える 1

0

これは可能ですか?手順を使用してこれを行っていると仮定します。多くの行を更新する場合は、カーソルを使用して反復するのが最善です。ただし、カーソルは行ごとに処理しているため、時間がかかります。

declare g_col_a datatype;
begin
select g(cola_0) into g_col_a from table where .......
update table
end;
/
于 2013-09-30T11:56:17.880 に答える