具有异常处理的另一个过程中的过程调用.所有调用的时间戳相同,而不是所有在错误情况下执行的调用



如果有一个简单的过程,为我做一些日志处理:

CREATE PROCEDURE logging(name TEXT, message TEXT) 
BEGIN  
INSERT INTO log_table
SELECT NOW(), name,  message;
END

现在我从另一个过程内部多次调用我的过程:

CREATE PROCEDURE my_proc()
BEGIN
CALL logging('my_proc', 'start');

insert into myTable
select * from another_table;

CALL logging('my_proc', 'end');
EXCEPTION WHEN OTHERS THEN
CALL logging('my_proc',SQLSTATE || ' - ' ||SQLERRM );
END 

问题:当过程正常运行时,开始和结束具有完全相同的时间戳,尽管查询确实花费了一些时间:

  • "2022-11-16 15:11:01.322317"my_proc"时">
  • "2022-11-16 15:11:01.322317"my_proc"以何种

将过程更改为使用时间戳作为参数,而不是在过程中生成它,会得到相同的行为

问题二:发生错误时,只执行异常内的过程调用,不执行start调用。因此,我只在日志表中看到错误消息,而不是start-Message。

那么,我怎么能修复时间戳,使他表示查询之前和之后的时间,而不是使用相同的时间?

我怎么能执行我的第一个过程调用('start'),即使错误与异常处理发生在查询之后?

您可以通过不同的事务拆分代码。例如:

CREATE OR REPLACE PROCEDURE my_proc()
LANGUAGE plpgsql
AS $procedure$
BEGIN
CALL logging('my_proc', 'start');

begin
insert into myTable
select * from another_table;

CALL logging('my_proc', 'end');
EXCEPTION WHEN OTHERS THEN
CALL logging('my_proc',SQLSTATE || ' - ' ||SQLERRM );
end;
END;
$procedure$

所以,我解释了为什么你得到相同的时间戳。在PostgreSQL上,current_datenow()为相同的事务获得相同的时间戳。这些刷新了事务开始时的时间。您可以使用clock_timestamp(),该函数在执行语句时刷新。

最新更新