Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在调用postgresql过程之前检查它是否存在_Postgresql_Plpgsql - Fatal编程技术网

如何在调用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;