2010-06-18 56 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