C# 无论您是在插入还是在更新,该表都将显示。这就是造成上述序列间隔的原因。当您更新一行时,序列仍然会递增。嗯,我知道只有当序列作为查询本身的一部分被引用时,才会发生这种情况。就触发器而言,语句级触发器肯定会触发,但我相信行级插入和更新触发器在合并时的行为是正确

C# 无论您是在插入还是在更新,该表都将显示。这就是造成上述序列间隔的原因。当您更新一行时,序列仍然会递增。嗯,我知道只有当序列作为查询本身的一部分被引用时,才会发生这种情况。就触发器而言,语句级触发器肯定会触发,但我相信行级插入和更新触发器在合并时的行为是正确,c#,sql,oracle,merge,upsert,C#,Sql,Oracle,Merge,Upsert,无论您是在插入还是在更新,该表都将显示。这就是造成上述序列间隔的原因。当您更新一行时,序列仍然会递增。嗯,我知道只有当序列作为查询本身的一部分被引用时,才会发生这种情况。就触发器而言,语句级触发器肯定会触发,但我相信行级插入和更新触发器在合并时的行为是正确的。这里有一个演示也表明了这一点。所以你可能想验证一下。我会自己做,但我正在开会。太棒了,真的很感谢链接。那条线索证实了我的怀疑。我认为merge可能会使insert和update触发器都跳闸,但没有任何证据。我在before insert行触


无论您是在插入还是在更新,该表都将显示。这就是造成上述序列间隔的原因。当您更新一行时,序列仍然会递增。嗯,我知道只有当序列作为查询本身的一部分被引用时,才会发生这种情况。就触发器而言,语句级触发器肯定会触发,但我相信行级插入和更新触发器在合并时的行为是正确的。这里有一个演示也表明了这一点。所以你可能想验证一下。我会自己做,但我正在开会。太棒了,真的很感谢链接。那条线索证实了我的怀疑。我认为merge可能会使insert和update触发器都跳闸,但没有任何证据。我在before insert行触发器中有递增的序列,它被merge命中。
create or replace
PROCEDURE     P_SAVE_EXAMPLE_TABLE_ROW
(
    pID IN OUT EXAMPLE_TABLE.ID%type,
    --Other row params here
    pUSER IN EXAMPLE_TABLE.CREATE_USER%type,

    pPLSQLErrorNumber OUT NUMBER, 
    pPLSQLErrorMessage OUT VARCHAR2
)
AS
BEGIN
MERGE INTO USERS_WORKGROUPS_XREF USING dual ON (ID=pID)
    WHEN NOT MATCHED THEN
        INSERT (--OTHER COLS--, CREATE_USER) VALUES (--OTHER COLS--, pUSER)
    WHEN MATCHED THEN
        UPDATE SET
            --OTHER COLS--
            UPDATE_USER=pUSER
        WHERE ID=pID;
    EXCEPTION
        WHEN OTHERS THEN
        pID := 0;
        pPLSQLErrorNumber := SQLCODE;
        pPLSQLErrorMessage := SUBSTR(SQLERRM, 1, 256);
        RETURN;

    -- STATEMENT TO RETURN LAST AFFECTED ID INTO pID GOES HERE
END;