我遇到了麻烦,我已经尝试了一切(在我看来,这当然是错误的,因为答案就在那里)
代码块更新proposed_raises表中的所有必需行,尽管它应使用不同的值更新proposed_new_salary字段,因为游标为 e.salary 检索六个不同的值。
代码:
DECLARE
CURSOR cur_rai_sal (p_salary_num NUMBER) IS
SELECT e.employee_id, e.department_id, e.salary
FROM employees e, proposed_raises rs
WHERE e.salary <= p_salary_num
FOR UPDATE OF rs.date_proposed, rs.date_approved, rs.proposed_new_salary NOWAIT;
BEGIN
FOR v_cur_rai_sal IN cur_rai_sal(5000) LOOP
--DBMS_OUTPUT.PUT_LINE(v_cur_rai_sal.employee_id ||''||v_cur_rai_sal.department_id|| ' ' || v_cur_rai_sal.salary);
UPDATE proposed_raises
SET date_proposed = SYSDATE,
date_approved = NULL,
proposed_new_salary = v_cur_rai_sal.salary /100*105
WHERE CURRENT OF cur_rai_sal;
END LOOP;
END;
没有错误消息,只有"更新了 1 行"。
提前谢谢你:)
目前尚不清楚您的问题是什么。 我使用如下定义的表编写了一些类似的代码:
create table t1 (id int, val number);
insert into t1 select rownum, rownum*1000 from user_objects where rownum < 10;
SQL> select * from t1;
ID VAL
---------- ----------
1 1000
2 2000
3 3000
4 4000
5 5000
6 6000
7 7000
8 8000
9 9000
DECLARE
CURSOR c (p_salary_num NUMBER) IS
SELECT id, val
FROM t1
FOR UPDATE OF val NOWAIT;
BEGIN
FOR v_c IN c(5000) LOOP
UPDATE t1
SET val = v_c.val /100*105
WHERE CURRENT OF c;
END LOOP;
END;
它工作正常:
SQL> select * from t1;
ID VAL
---------- ----------
1 1050
2 2100
3 3150
4 4200
5 5250
6 6300
7 7350
8 8400
9 9450
但是,您必须执行其他操作,因为您的代码永远不会生成消息"1 行已更新",它会说"PL/SQL 过程已成功完成"。 因此,您似乎正在执行不在 PL/SQL 块中的独立 UPDATE 语句。