2

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

4

3 回答 3

4

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

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

✓</p>

do $$
begin
  create function f (int)
  returns int
  language sql
  as 'select $1';
end; $$
错误:函数“f”已经存在,具有相同的参数类型
CONTEXT:SQL 语句“创建函数 f (int)
 返回整数
 语言 sql
 作为'选择 $1'"
SQL 语句中的 PL/pgSQL 函数 inline_code_block 第 3 行
do $$
begin
    create function f (int)
    returns int
    language sql
    as 'select $1';
    
  exception
    when duplicate_function then
    null;
end; $$

✓</p>

db<>在这里摆弄

于 2021-10-12T22:17:01.990 回答
1

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

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

于 2021-10-12T21:44:30.447 回答
1

这是我必须做的

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;
于 2021-10-14T02:21:44.597 回答