2011-10-20 88 views
5

最近、マージ・ステートメント内の順序値を増やすことに関する問題が発生しました。Oracle Merge文の順序の動作

MERGE INSERT句は、列の1つを入力するためにシーケンスにアクセスしています。実際に挿入できる行の数は関係ありません。ソースのSELECT句のレコード数の合計が増えていきます。

どうしてですか?

私は、Oracle 10gリリース2に取り組んでいます、私は答えを見つけた

+0

を指すため

。 Oracleのドキュメントに従って、シーケンスはマージされたレコードごとに増分され、実際に挿入されるレコードの数は関係ありません。 – Incognito

+0

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

+3

コメントを回答に変換し、それを受け入れる必要があります。あなたはあなた自身の答えを受け入れることが許されています(あなたはそれのバッジを得るかもしれません)。受け入れられた答えは、SOの最終ゲームです。 – APC

答えて

2

あなたは、MERGE文の分岐が実際に使用されている場合にのみ、「挿入」と呼ばれているロジックが関数である。この

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; 

などの値をインクリメントする機能を使用することによってこの問題を解決することができます。さらに、私は答えを見つけたこの http://alex-td.blogspot.in/2012/07/sequences-nextval-in-merge-operator.html