对于更新,光标锁定



我遇到了麻烦,我已经尝试了一切(在我看来,这当然是错误的,因为答案就在那里)

代码块更新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 语句。

最新更新