2015-08-14 39 views
3

Oracle文檔指出FOR UPDATE子句在子查詢中不受支持。 我有兩張表,父母和孩子。在代碼中,選擇父表中的隨機記錄並更新相應的子記錄。例如,表結構可能類似於:在Oracle的子查詢中SELECT ... FOR UPDATE的替代方法是什麼?

parent(obj_id string, status integer,....) 
child(obj_id string, status integer, parent_id string,....) 

和查詢可能是這樣的:

UPDATE child 
    set status =1 
WHERE parent_id IN (SELECT obj_id 
        FROM parent where status = 1 
        and rownum < 10 FOR UPDATE SKIP LOCKED) 

該查詢是從兩個不同的機器兩種不同的工藝執行。

你能解釋一下如何將FOR UPDATE鎖定機制擴展到子查詢中嗎?

+0

改寫選擇爲內部連接,並可以FOR UPDATE添加到查詢 –

回答

2

你可以使用PL/SQL和運行兩個單獨的查詢:

CREATE TYPE numbers AS TABLE OF NUMBER(18); 
/

DECLARE 
    n numbers; 
BEGIN 
    SELECT obj_id 
    BULK COLLECT INTO n 
    FROM parent WHERE status = 1 AND rownum < 10 
    FOR UPDATE SKIP LOCKED; 

    UPDATE child 
    SET status = 1 
    WHERE parent_id IN (SELECT * FROM TABLE(n)); 
END; 
/
相關問題