Это потому, что предложение 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
принадлежат, поэтому мой код может (или не может) работать, но я надеюсь, что вы поняли общую идею.