如果不存在,如何创建函数?

How to CREATE FUNCTION IF NOT EXISTS?

有没有简单的方法可以做到如果不存在就创建函数? 我有多个模式,我正在准备一个脚本,该脚本将在目标模式中创建缺失的对象。计划是 运行 一个脚本来检查对象是否存在,如果不存在则什么也不做,它将创建它。 'CREATE SOMETHING IF NOT EXISTS' 完美地处理表序列和其他表,但是找不到函数的解决方案。 我来自 Tsql 世界,它有这个检查。 但是,看起来 Postgres 9.6 没有它。有什么简单的方法可以绕过这个限制吗?

您可以使用 create or replace - 但如果函数的签名发生变化,那将不起作用。

另一种选择是使用 drop function if exists 后跟 create function。请确保在此之后再次设置所需的权限。

您可以用匿名块包装函数定义并处理重名异常:

create function f(int)
returns int
language sql
as 'select ';

do $$
begin
  create function f (int)
  returns int
  language sql
  as 'select ';
end; $$
ERROR:  function "f" already exists with same argument types
CONTEXT:  SQL statement "create function f (int)
 returns int
 language sql
 as 'select '"
PL/pgSQL function inline_code_block line 3 at SQL statement
do $$
begin
    create function f (int)
    returns int
    language sql
    as 'select ';
    
  exception
    when duplicate_function then
    null;
end; $$

db<>fiddle here

这是我必须做的

IF EXISTS (SELECT FROM information_schema.routines 
                 WHERE routine_schema = 'schema_name'
                   AND rouitine_name = 'vw_cmp') 
            THEN
                raise notice 'Routine vw_cmp EXISTS';
            ELSE
              --  create proc SQL
END IF;