2010-06-18 50 views
8

我正在从表FOO和BAR中进行选择。我想锁定正在返回的FOO记录,但我不希望BAR的记录被锁定。Oracle使用SELECT锁定...更新

cursor c_foobar is 
select foo.*, bar.* from 
foo, bar 
where foo.id = bar.foo_id 
for update of <what should I put here?> 

看来我需要指定单个列,但我希望foo的整个记录​​被锁定。例如我希望我可以这样做:

cursor c_foobar is 
select foo.*, bar.* from 
foo, bar 
where foo.id = bar.foo_id 
for update of foo 

我必须列举FOO的每一列在for update of部分,以锁定他们呢?或者我可以任意选择foo中的任何列,即使那些不是它的主键,它会锁定整个记录?

回答

12

the 10G PL/SQL documentation

当查询多个表,你可以使用 FOR UPDATE子句来限制 行锁定到特定的表。只有在FOR UPD UPDATE OF子句引用该表中的列 时,才锁定表中的行 。例如, 以下查询锁定在 员工表,但不是在 部门表行:

DECLARE 
    CURSOR c1 IS SELECT last_name, department_name FROM employees, departments 
    WHERE employees.department_id = departments.department_id 
      AND job_id = 'SA_MAN' 
     FOR UPDATE OF salary; 
+0

非常好;不知道我是如何错过的。所以我想它只是需要任何行中的任意列名...很容易,但对我来说似乎不是非常直观。 – 2010-06-18 14:43:27

+0

我同意,它不。我似乎还记得很久以前在某个地方读过,指定列的要求是这样的,以至于在将来的某个版本中,Oracle可能只会锁定该行中的特定列。但是我的记忆很朦胧。 – 2010-06-18 14:54:22

+2

这是一种自我记录代码的形式,我认为:“我只打算更新'salary'列'” – 2010-06-19 07:14:14