我有兩個表說A(詳細表)和B(彙總表)。跨月循環
表A的交易在一年內落入不同的月份。表B有一些字段被定義爲對應於一個特定的月份(如下圖所示)。我想要一個從表A中獲取記錄並更新表B的過程,例如說第1個月的金額將在YTDBAL_1中總結,第2個月將是第1個月加上第2個月的總和(YTDBAL2)等等使得連續的月份將保持從年初至今(本月)的累計餘額。在表A
OFFCD GLHEAD YEAR MONTH AMOUNT
010 10101001 2014 01 25,000.00
010 10101001 2014 01 5,000.00
010 10101001 2014 02 8,000.00
010 10101001 2014 02 4,000.00
010 10101001 2014 03 10,000.00
010 10101001 2014 04 10,000.00
010 10101001 2014 05 -4,000.00
010 10101001 2014 05 3,000.00
..
..
010 10101001 2014 12 1,000.00
預期數據
示例數據表B
OFFCD GLHEAD YEAR YTDBAL_1 YTDBAL_2 YTDBAL_3 YTDBAL_4 YTDBAL_5 ..... YTDBAL_12
010 10101001 2014 30,000 42,000 52,000 62,000 61,000 XXX
我的過程下面被填充以相同量的所有字段。我如何使它達到預期的結果。 注意:交易表有超過一百萬條記錄,我正在使用Oracle 11g。
CREATE OR REPLACE PROCEDURE rectify_gl_bal(w_year Number)
IS
CURSOR gl_cur IS
Select * from nlmstdtl
where period_year=w_year;
TYPE gl_array IS TABLE OF gl_cur%ROWTYPE;
gldtl gl_array;
Begin
open gl_cur;
Loop
Fetch gl_cur bulk collect into gldtl limit 500;
EXIT WHEN gldtl.count = 0;
Forall x in 1..gldtl.count
update nlmst
set NLMST.YTDBAL_1 = NLMST.YTDBAL_1 + gldtl(x).amount,
NLMST.YTDBAL_2 = NLMST.YTDBAL_2 + gldtl(x).amount,
NLMST.YTDBAL_3 = NLMST.YTDBAL_3 + gldtl(x).amount,
NLMST.YTDBAL_4 = NLMST.YTDBAL_4 + gldtl(x).amount,
NLMST.YTDBAL_5 = NLMST.YTDBAL_5 + gldtl(x).amount,
NLMST.YTDBAL_6 = NLMST.YTDBAL_6 + gldtl(x).amount,
NLMST.YTDBAL_7 = NLMST.YTDBAL_7 + gldtl(x).amount,
NLMST.YTDBAL_8 = NLMST.YTDBAL_8 + gldtl(x).amount,
NLMST.YTDBAL_9 = NLMST.YTDBAL_9 + gldtl(x).amount,
NLMST.YTDBAL_10 = NLMST.YTDBAL_10 + gldtl(x).amount,
NLMST.YTDBAL_11 = NLMST.YTDBAL_11 + gldtl(x).amount,
NLMST.YTDBAL_12 = NLMST.YTDBAL_12 + gldtl(x).amount
where nlmst.offcd = gldtl(x).offcd and
nlmst.period_year = gldtl(x).period_year and
nlmst.glhead = gldtl(x).glhead;
End Loop;
commit;
close gl_cur;
End;
請出示表列的定義,什麼是「gldtl」功能? – OldProgrammer 2014-10-06 15:42:36
我的想法並不清楚,但是從你的描述中,不會有一個簡單的SUM()... GROUP BY ...或SUM()OVER(PARTITION ...) ? – 2014-10-06 16:44:19
@OldProgrammer - 'gldtl'是過程中的一個變量 - FETCH ... BULK COLLECT的目標。 – 2014-10-06 16:48:42