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

现在,我想做的就是这样。我有两个(确定性)函数fg. 我想做以下事情:

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));

我无法想象这么简单的事情没有优雅高效的解决方案。在我看来,这是一种很常见的模式。

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 回答