如果有一个简单的过程,为我做一些日志处理:
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_date
或now()
为相同的事务获得相同的时间戳。这些刷新了事务开始时的时间。您可以使用clock_timestamp()
,该函数在执行语句时刷新。