Обновление таблицы курсора по множеству значений - PullRequest
0 голосов
/ 07 июня 2018
DECLARE
   CURSOR contacts
   IS
        SELECT SUM (budget) AS budget
          FROM et_bp_gl_account a, et_bp_fact f
         WHERE     f.gl_account_id = a.gl_account_id
               AND total_flag = 0
      GROUP BY month_id, org_unit_id;
BEGIN
   FOR r IN contacts
   LOOP
      UPDATE et_bp_fact
         SET budget = r.budget
       WHERE gl_account_id IN (SELECT total_element
                                 FROM et_bp_gl_account g, et_bp_fact f
                                WHERE f.gl_account_id = g.gl_account_id);
   END LOOP;
END;

Я хочу обновить таблицу ET_BP_FACT примером многих значений (25,50,75), возвращаемым из курсора, но когда я выполняю таблицу, обновленную (25,25,25)

Я думаю, что есть проблема в цикле

1 Ответ

0 голосов
/ 07 июня 2018

Это потому, что предложение UPDATE WHERE не "ссылается" на значения курсора.Примерно так:

DECLARE
   CURSOR contacts
   IS
        SELECT month_id, org_unit_id,         --> include additional columns here ... 
               SUM (budget) AS budget
          FROM et_bp_gl_account a, et_bp_fact f
         WHERE     f.gl_account_id = a.gl_account_id
               AND total_flag = 0
      GROUP BY month_id, org_unit_id;
BEGIN
   FOR r IN contacts
   LOOP
      UPDATE et_bp_fact
         SET budget = r.budget
       WHERE gl_account_id IN 
         (SELECT total_element
          FROM et_bp_gl_account g, et_bp_fact f
          WHERE f.gl_account_id = g.gl_account_id
            --
            AND f.org_unit_id = r.org_unit_id   --> ... and reference them here ...
            AND g.month_id = r.month_id);
                                                --> ... or, possibly, here
   END LOOP;
END;

Я бы посоветовал вам всегда ставить перед именами столбцов псевдонимы таблиц, потому что - глядя на ваш код, нет никакой возможности угадать, какие таблицыMONTH_ID и ORG_UNIT_ID принадлежат, поэтому мой код может (или не может) работать, но я надеюсь, что вы поняли общую идею.

...