2013-04-12 66 views
0

我需要做的是插入記錄表TAB_B它來作爲從選擇到餐桌TAB_A結果(表結構相同),這樣的:平原插入VS PLSQL插入 - 利弊

INSERT /*+ APPEND */ INTO TAB_B SELECT * FROM TAB_A WHERE [CONDITION] 

的事情是,我需要知道有多少記錄被插入,那麼最簡單的方法是插入後算來:反正

SELECT COUNT(*) FROM TAB_A WHERE [CONDITION] 

,這將是巨大的,如果我可以省略與相同條件下執行查詢兩次,所以我可以這樣做:

BEGIN 
    INSERT /*+ APPEND */ INTO TAB_B SELECT * FROM TAB_A WHERE [CONDITION]; 
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT); 
END; 

現在的問題是: 「plsql解決方案有沒有什麼缺點 - 尤其是PERFORMANCE?我應該堅持插入物,隨後計數或不?」

編輯 紳士,我想我的問題不能被更清晰地問,這是關於性能差異以及最終的缺點,而不是方法本身(我試着在標題和問題本身中說明它更好)你標記爲重複的問題是關於如何對行進行計數,無論我的問題是哪種方法在性能方面更好,以及在使用上述任何方法時是否存在任何缺點。

+1

在pl/sql塊中運行插入與在塊外運行沒有任何不利之處。 – 2013-04-12 09:36:28

+0

對上下文沒有把握,但是如果你是從代碼中調用它,你通常會做'command.ExecuteNonQuery()',它通常有一個int作爲返回類型,告訴你受影響的行數。不知道這是否會有所幫助,因爲您沒有提及數據庫本身以外的其他上下文。 –

回答

3

假設你在PL/SQL這樣做(由標籤所示),最簡單的方式來完成你想要的是使用SQL%ROWCOUNT,如:

INSERT /*+ APPEND */ INTO TAB_B SELECT * FROM TAB_A WHERE [CONDITION]; 

nRows_inserted := SQL%ROWCOUNT; 

要知道使用COUNT(*)查詢實際插入了多少行,您必須在插入前執行一次,然後再考慮表中可能存在行已滿足在執行插入之前的條件。

分享和享受。

+0

請再讀一遍我的問題,這是關於所提供方法的性能差異。另外,我可以計算查詢源表的插入行數。 – WojtusJ

+0

爲什麼downvote?這正是答案 - 如果你在plsql裏面,'SQL%ROWCOUNT'更好,因爲它不會運行查詢兩次 –

+0

它說你找不到只有一個'select'的插入行數,因爲那裏可能是在插入前滿足條件的行。即使你在insert操作之前執行另一個'select',也可能會在表中插入或刪除。所以是的,你應該堅持'SQL%ROWCOUNT' – lunr