2013-09-30 43 views
1

首先,我是Oracle的新手,所以我的問題可能很愚蠢。 但我會盡量清楚。某些列的`map`,避免重新計算參數

我有幾張表我想更新。每個結構都相同:第一個特殊列,然後是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

您可能想要了解有關標量子查詢緩存的內容。 [這裏](http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51asktom-453438.html)是Tom Kyte在這個主題上發表的一篇文章。 –

回答

0

這可能嗎?假設你正在使用過程來做這件事。如果要更新多行,最好使用遊標進行迭代。但是,遊標正在逐行處理,並且會很耗時。

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