2011-10-20 48 views
5

最近,我遇到了與在合併語句內增加序列值有關的問題。Oracle合併語句中的序列行爲

MERGE INSERT子句正在訪問序列以填充其中一列。我注意到,有多少行實際上符合插入條件並不重要,該序列最終會增加源SELECT子句中記錄的總數。

爲什麼會發生這種情況?

我工作的Oracle 10gR2中

感謝,

+0

我已經找到了答案。根據Oracle文檔,每個合併記錄的順序將遞增,並且無論實際插入了多少條記錄都無關緊要。 – Incognito

+0

[鏈接](http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns002.htm#sthref809) – Incognito

+3

你應該把你的意見轉換成答案,然後接受它。你可以接受你自己的答案(你甚至可以得到它的徽章)。接受的答案是SO的最終遊戲。 – APC

回答

2

您可以通過使用一個函數來增加這樣

CREATE OR REPLACE 
FUNCTION seq_nextval_on_demand (p_seq_name IN VARCHAR2) 
    RETURN NUMBER 
IS 
    v_seq_val NUMBER; 
BEGIN 
    EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' 
    INTO v_seq_val; 

    RETURN v_seq_val; 
END seq_nextval_on_demand; 

的邏輯函數值解決這個問題,只有當「插入」 MERGE語句的分支真正使用時調用。

進一步參照此 http://alex-td.blogspot.in/2012/07/sequences-nextval-in-merge-operator.html