首先,我是Oracle的新手,所以我的问题可能是愚蠢的。 不过我会尽力说清楚。
我有几个表要更新。每个都具有相同的结构:第一个特殊列,然后是n
列,最后是n
列,它们将以某种方式镜像n
之前的列。 (因此,该表将具有2×n + 1列)。请注意,n的值将因表而异。
例如,对于表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
现在,我想做的就是这样。我有两个(确定性)函数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)
的值,然后计算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));
我无法想象那些简单的东西没有优雅而有效的解决方案。在我看来,这是一种非常普遍的模式。
答案 0 :(得分:0)
这可能适合你吗?假设你正在使用程序。如果要更新许多行,最好使用游标进行迭代。但是,游标正在逐行处理,这将耗费大量时间。
declare g_col_a datatype;
begin
select g(cola_0) into g_col_a from table where .......
update table
end;
/