列的某种“map”,避免重新计算参数

时间:2013-09-30 10:43:59

标签: oracle plsql

首先,我是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

现在,我想做的就是这样。我有两个(确定性)函数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));

我无法想象那些简单的东西没有优雅而有效的解决方案。在我看来,这是一种非常普遍的模式。

1 个答案:

答案 0 :(得分:0)

这可能适合你吗?假设你正在使用程序。如果要更新许多行,最好使用游标进行迭代。但是,游标正在逐行处理,这将耗费大量时间。

declare g_col_a datatype;
begin
select g(cola_0) into g_col_a from table where .......
update table
end;
/