我有一个包含Quantity和Remaining列的表,并且必须在通过某个日期列对其进行排序后更新表中的所有行。
剩余列的值由(前一行的剩余)+或 - (此行的数量)计算。我已经编写了一个游标循环来完成这项任务,但它需要很长时间才能完成。
$cookie_name="cook";
setcookie($cookie_name, $row['key'],2 * 24 * 60 * 60 * 1000), "/");
我能做些什么来更快地实现这个目标,还是有其他方法可以用来实现这个目标?
编辑:示例数据
OPEN KAL;
LOOP
FETCH KAL
INTO V_PK_ID, V_TYPE_ID, V_QUANTITY;
IF (V_TYPE_ID = 1) THEN
V_REMAINING := V_REMAINING + V_QUANTITY;
ELSE
V_REMAINING := V_REMAINING - V_QUANTITY;
END IF;
UPDATE TABLE K
SET K.REMAINING = V_REMAINING
WHERE K.KALAMAZOO_ID = V_PK_ID;
END LOOP;
CLOSE KAL;
例如,如果我以“1000”开头,则类型1用于( - )而类型2用于(+),行将像上面一样更新。
答案 0 :(得分:3)
您可以使用merge
执行此操作。逻辑是这样的:
merge into k
using (select k.*,
sum(case when v_type_id = 1 then v_quantity else - v_quantity end) over
(order by v_pk_id) as new_remaining
from k
) s
on (k.v_pk_id = s.v_pk_id)
when matched then
update set k.remaining = s.new_remaining;
计算时不需要PL / SQL循环。