如何确保我的两个程序在同一会话期间更新相同的记录

问题描述 投票:0回答:1

我有两个过程 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 ;
logging time plsql sql-update record
1个回答
0
投票

您的代码片段表明正在创建 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;
© www.soinside.com 2019 - 2024. All rights reserved.