Oracle - 基于先前行值更新顺序行的最快方法

时间:2016-07-10 16:17:31

标签: oracle plsql sql-update

我有一个包含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用于(+),行将像上面一样更新。

1 个答案:

答案 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循环。