FOR UPDATE OF,游标锁定

时间:2013-12-20 13:20:45

标签: oracle for-loop plsql cursor

我遇到了麻烦,我已经尝试了所有事情(在我的意见中,当然这是错的'因为答案就在那里)

代码块更新了proposed_raises表中的所有necessery行,尽管它应该使用不同的值更新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行更新”。

提前谢谢你:)

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你的问题是什么。我使用如下定义的表编写了一些类似的代码:

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语句。