最近,我遇到了與在合併語句內增加序列值有關的問題。Oracle合併語句中的序列行爲
MERGE INSERT子句正在訪問序列以填充其中一列。我注意到,有多少行實際上符合插入條件並不重要,該序列最終會增加源SELECT子句中記錄的總數。
爲什麼會發生這種情況?
我工作的Oracle 10gR2中
感謝,
最近,我遇到了與在合併語句內增加序列值有關的問題。Oracle合併語句中的序列行爲
MERGE INSERT子句正在訪問序列以填充其中一列。我注意到,有多少行實際上符合插入條件並不重要,該序列最終會增加源SELECT子句中記錄的總數。
爲什麼會發生這種情況?
我工作的Oracle 10gR2中
感謝,
我已經找到了答案。根據Oracle文檔,每個合併記錄的順序將遞增,並且無論實際插入了多少條記錄都無關緊要。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns002.htm#sthref809
您可以通過使用一個函數來增加這樣
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
我已經找到了答案。根據Oracle文檔,每個合併記錄的順序將遞增,並且無論實際插入了多少條記錄都無關緊要。 – Incognito
[鏈接](http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns002.htm#sthref809) – Incognito
你應該把你的意見轉換成答案,然後接受它。你可以接受你自己的答案(你甚至可以得到它的徽章)。接受的答案是SO的最終遊戲。 – APC