2

有问题的表模式在这里: Oracle SQL: Selecting a single row with the latest date between multiple columns

我正在使用一个包含超过 500 万个条目的表。使用存储过程更新插入此表并返回最后更新的行 ID 的最快和最准确的方法是什么?

我读过的大部分内容都建议对 upsert 使用合并语句。但是,merge 不支持返回。

在我们的表中,我们有按预期更新的 CREATE_DATE、CREATE_USER、UPDATE_DATE 和 UPDATE_USER 字段。我的想法是创建一个存储过程,该过程返回在这两列之间具有最新日期的行的 id,并且相应的用户数据等于当前用户数据。这就是回答所指问题的人对我的帮助(谢谢!)。

但是,我担心与其他方法相比的组合执行时间,以及由于合并而在序列中产生的巨大差距。简单地调用单独的语句来获取 id 似乎也有点低效。但是,我读过的几乎所有内容都说合并比合并前的 upsert 语句快得多。

请注意,这些是通过 ac#/asp Web 应用程序调用的。任何帮助表示赞赏:)

编辑

下面是我用于 Upsert 的存储过程的示例。请注意,CREATE_DATE 和 UPDATE_DATE 列使用触发器进行更新。

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;
4

1 回答 1

1

如果您尝试在表上返回序列生成的 PK 的最大值,那么我只需在之后直接运行“Select max(id) ..”。如果其他会话也在修改表格,那么阅读序列的曲线可能会更好。

于 2013-06-06T15:37:14.097 回答