2011-11-05 101 views
1

跟進我先前的查詢Update Query,我繼續改寫了整個查詢,如下所示:更新查詢無法正確地更新 - 甲骨文

表A是由一個連接到表B,以一對多的關係上[PRD_ID, PRD_VER, PY_ID, TPY_ID]和表C通過[PRD_GTIN_ID]上的一對一關係連接到表B.我需要複製列X,Y,Z表A到X,Y,Z表C

DECLARE CURSOR eachRec IS 
SELECT cgl.prd_gtin_id, 
     tc.PRD_SPL_OR_QTY_MULTIPLE 
FROM B cgl, 
    A tc 
WHERE cgl.prd_id  = tc.prd_id 
    AND cgl.prd_ver  = tc.prd_ver 
    AND cgl.py_id  = tc.py_id 
    AND cgl.tpy_id  = tc.tpy_id; 

BEGIN 
    FOR EACH_ROW IN eachRec 
    LOOP 
    UPDATE C 
    SET C.PRD_ORDER_QTY_MULTIPLE=EACH_ROW.PRD_ORDER_QTY_MULTIPLE 
    WHERE C.prd_gtin_id = EACH_ROW.prd_gtin_id; 
    END LOOP; 
END; 

除了更新權相匹配的查詢上,還更新隨機行在這是不正確。如果有人能幫我找到我寫過的查詢的問題?

+3

爲什麼使用遊標?只需要一個更新語句就可以達到同樣的效果,這個語句比光標方法快得多。 –

+0

那麼,我不關心這個查詢的性能。這只是一次完成(類似於需要更新30K記錄的遷移)。我唯一的擔心顯然是查詢結果的準確性。 –

回答

1

你在這裏真正需要的是理解一個鍵保存表和可更新連接視圖的概念。

由於這是不平凡的科目,和Oracle做得很好覆蓋它們的文檔中,我就點你的相關文件: http://download.oracle.com/docs/cd/E11882_01/server.112/e25494/views001.htm#ADMIN11782

如果你能閱讀和理解這些概念,用單個更新語句來做你想要的東西不應該是個問題,這個語句既清晰又易於理解,而且更快,更高效。

希望有所幫助。