Не могли бы вы добиться того же с помощью одного оператора обновления SQL?
UPDATE cptemplateworkcard tmpcard
SET tmpcard.budget_hour = (SELECT budget_hour
FROM cp_work_card cp
WHERE cp.job_id = tmpcard.jobid
AND rownum < 2)
WHERE EXISTS
(SELECT 1
FROM cp_work_card cp
WHERE cp.job_id = tmpcard.jobid);
Я не проверял это, но принцип тот же ...
РЕДАКТИРОВАТЬ: учитываяваши ограничения и если вы должны использовать процедуру, то вы не могли бы:
DECLARE
CURSOR c1
IS
SELECT DISTINCT
cp.job_id,
cp.budget_hour
FROM cp_work_card cp
INNER JOIN cptemplateworkcard temp
ON (cp.job_id = temp.jobid)
WHERE rownum < 2;
BEGIN
DBMS_OUTPUT.put_line( 'job_id : budget_hour' );
FOR c_rec IN c1
LOOP
UPDATE cptemplateworkcard tmpcard
SET tmpcard.budget_hour = c_rec.budget_hour
WHERE tmpcard.jobid = c_rec.job_id;
DBMS_OUTPUT.put_line( c_rec.job_id || ' : ' || c_rec.budget_hour );
END LOOP;
END;
РЕДАКТИРОВАТЬ: К вашему сведению, ваша текущая процедура не работает, потому что вы назвали свою переменную, содержащую идентификатор задания, как jobId
которое также является именем столбца в таблице cptemplateworkcard
.Поэтому, когда вы выполняете свое обновление, оно по умолчанию думает, что ваше предложение WHERE
сравнивает столбец таблицы с самим собой, тем самым обновляя каждую строку с любым значением bHours
.Когда процедура завершится, очевидно, что последнее значение bHours
равно как окончательному значению, возвращенному курсором, следовательно, вы видите все значения в таблице, установленные на это окончательное значение.
Если вы переименуетеВаша jobId
переменная, похожая на v_jobid
, должна решить проблему.
Надеюсь, это поможет ...
Если единственным ограничением является то, что она должна быть в PL / SQLпроцедурный блок, то это будет самая эффективная процедура:
BEGIN
UPDATE cptemplateworkcard tmpcard
SET tmpcard.budget_hour = (SELECT budget_hour
FROM cp_work_card cp
WHERE cp.job_id = tmpcard.jobid
AND rownum < 2)
WHERE EXISTS
(SELECT 1
FROM cp_work_card cp
WHERE cp.job_id = tmpcard.jobid);
DBMS_OUTPUT.put_line(SQL%rowcount||' record(s) updated');
END;