我有两个过程 PROC_BEGIN 和 PROC_END,用于记录用于在我们的仓库中创建聚合表的存储过程的性能。我正在运行 Oracle 版本:Oracle Database 19c
CREATE OR REPLACE PACKAGE BODY SCHEMA.MY_PACKAGE AS
PROCEDURE PROC_DO_SOMETHING IS
BEGIN
PKG_ETL_LOGGER.PROC_BEGIN(parameters); --gets the start time, name of called procedure and inserts into a log table
--Execute my code that
PKG_ETL_LOGGER.PROC_END(parameters);--gets the end time, counts number of records and inserts into the log table
END;
END;
如何确保两个过程在同一会话中更新相同的记录?
我尝试使用日期和过程名称等类似列来更新记录,但我从运行相同代码的其他用户那里获得了重复记录
UPDATE USER_NAME.LOG_TABLE
SET ROW_COUNT = v_row_count,
PROC_END_TIME = v_end_time,
PROC_NAME = v_owner||'.'||v_caller,
RUN_TIME_SECS = (v_end_time - v_start_time )*24*60*60,
RCRD_INSRT_DATE = sysdate
WHERE ID_DATE = p_date AND PROC_NAME = v_owner||'.'||v_caller AND TABLE_NAME = P_TABLE_NAME ;
您的代码片段表明正在创建 2 个单独的日志记录,但您的问题表明它正在
PROC_BEGIN
中创建日志,并使用 PROC_END
中的附加信息更新相同的日志记录。我假设这就是你要问的。一种方法是在 PROC_BEGIN 中使用 OUT 参数以及所创建的日志记录的主键。然后将该值作为 IN 参数传递到 PROC_END。要获取插入时记录的主键,请使用 RETURNING INTO
子句。
因此,在 PROC_BEGIN 中,语句将类似于(缩短版本 - 根据需要进行更改)
INSERT INTO USER_NAME.LOG_TABLE (proc_name, rcrd_insrt_date)
VALUES (v_owner||'.'||v_caller, SYSDATE)
RETURNING id INTO l_id;
PROC_BEGIN 将有一个 OUT 参数,其值分配为 l_id
PROC_END 将采用参数 (p_id) 中的 id 来更新实际记录
UDPATE USER_NAME.LOG_TABLE
SET ...
WHERE id = p_id;