如果不存在,如何创建函数?
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;
有没有简单的方法可以做到如果不存在就创建函数? 我有多个模式,我正在准备一个脚本,该脚本将在目标模式中创建缺失的对象。计划是 运行 一个脚本来检查对象是否存在,如果不存在则什么也不做,它将创建它。 '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;