如何在调用postgresql过程之前检查它是否存在
我有一个架构中可能不存在的过程(它在服务启动时自行安装) 我目前正在使用另一个过程调用它如何在调用postgresql过程之前检查它是否存在,postgresql,plpgsql,Postgresql,Plpgsql,我有一个架构中可能不存在的过程(它在服务启动时自行安装) 我目前正在使用另一个过程调用它 执行一些模式。一些作业(x) 在调用该过程之前,如何检查该过程是否存在?您可以运行 IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_proc WHERE proname = 'some_job' AND pronamespace = 'some_schema'::regname
执行一些模式。一些作业(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;
你可以跑
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;