有问题的表模式在这里: 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;