在调用它之前,如何检查是否存在 postgresql 过程



>我有一个可能不存在于架构中的过程(它在服务启动时自行安装(

我目前正在从另一个过程中调用它

perform some_schema.some_job(x)

在调用它之前,如何检查此过程是否存在?

你可以运行

IF NOT EXISTS (SELECT 1
FROM pg_catalog.pg_proc
WHERE proname = 'some_job'
AND pronamespace = 'some_schema'::regnamespace)
THEN
...
END IF;

但这是一个坏主意,因为存在竞争条件。 如果并发会话运行相同的代码并在检查和调用函数之间创建函数,该怎么办?

通常最好执行以下操作:

BEGIN
/* might fail if the function does not exist */
PERFORM some_schema.some_job(x);
EXCEPTION
WHEN undefined_function THEN
BEGIN
CREATE FUNCTION ...
EXCEPTION
WHEN duplicate_function THEN
/* this is ok, concurrent process created it */
NULL;
END;
/* now it cannot fail */
PERFORM some_schema.some_job(x);
END;

最新更新