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

And*_*rey 7 sql postgresql psql postgres-9.6

是否有一种简单的方法可以创建CREATE FUNCTION IF NOT EXISTS?我有多个模式,并且正在准备一个脚本,该脚本将在目标模式中创建丢失的对象。计划是运行一个脚本来检查对象是否存在,如果不存在则不执行任何操作,它将创建它。“如果不存在则创建一些内容”可以完美地处理表序列和其他内容,但是无法找到函数的解决方案。我来自 Tsql 世界,它有这个检查。然而,Postgres 9.6 似乎没有它。有什么简单的方法可以绕过这个限制吗?

小智 9

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

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


ast*_*ntx 9

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

\n\n
\n
create function f(int)\nreturns int\nlanguage sql\nas \'select $1\';\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9c\x93

\n
\n\n
\n
do $$\nbegin\n  create function f (int)\n  returns int\n  language sql\n  as \'select $1\';\nend; $$\n
Run Code Online (Sandbox Code Playgroud)\n
\n错误:具有相同参数类型的函数“f”已存在\n上下文:SQL 语句“create function f (int)\n returns int\n language sql\n as \'select $1\'”\nPL/pgSQL function inline_code_block line 3 at SQL 语句\n
\n
\n\n
\n
do $$\nbegin\n    create function f (int)\n    returns int\n    language sql\n    as \'select $1\';\n    \n  exception\n    when duplicate_function then\n    null;\nend; $$\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9c\x93

\n
\n

db<>在这里摆弄

\n

  • @lonix似乎 [`duplicate_object`](https://www.postgresql.org/docs/13/errcodes-appendix.html) 应该处理这个问题。[db&lt;&gt;小提琴](https://dbfiddle.uk/?rdbms=postgres_13&amp;fiddle=6728b9f8a0e775d4bd87913661e4a60a) (2认同)