Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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_Stored Procedures - Fatal编程技术网

如何检查PostgreSQL上是否存在存储过程?

如何检查PostgreSQL上是否存在存储过程?,postgresql,stored-procedures,Postgresql,Stored Procedures,我对PostgreSQL非常陌生,并试图利用我在MS SQL Server和Oracle方面的知识来学习PostgreSQL。我正在寻找以下语句的等效语句,我们可以在MS SQL Server中使用它来检查存储过程是否存在,在PostgreSQL中,其中SPName是存储过程的名称 SELECT 1 FROM sys.procedures WHERE Name = 'SPName') SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID

我对PostgreSQL非常陌生,并试图利用我在MS SQL Server和Oracle方面的知识来学习PostgreSQL。我正在寻找以下语句的等效语句,我们可以在MS SQL Server中使用它来检查存储过程是否存在,在PostgreSQL中,其中SPName是存储过程的名称

SELECT 1 FROM sys.procedures WHERE Name = 'SPName')
SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'dbo.SPName')
试着这样做:

SELECT EXISTS (
  SELECT 1
  FROM   pg_proc JOIN pg_namespace on pg_proc.oid = pg_namespace.oid
  WHERE  pg_proc.proname = 'procedure name'
  and pg_namespace.nspname = 'name'  );
试着这样做:

SELECT EXISTS (
  SELECT 1
  FROM   pg_proc JOIN pg_namespace on pg_proc.oid = pg_namespace.oid
  WHERE  pg_proc.proname = 'procedure name'
  and pg_namespace.nspname = 'name'  );
如果尚未创建特定架构,请使用
public
pg_namespace.nspname='public'


您可以创建自定义函数来执行以下任务:

create or replace function function_exists (sch text,fun text) returns boolean as
$$
begin
EXECUTE  'select pg_get_functiondef('''||sch||'.'||fun||'''::regprocedure)';
return true;
exception when others then 
return false;
end;
$$ language plpgsql
和使用:

select function_exists('public','function_name()')
如果尚未创建特定架构,请使用
public
pg_namespace.nspname='public'


您可以创建自定义函数来执行以下任务:

create or replace function function_exists (sch text,fun text) returns boolean as
$$
begin
EXECUTE  'select pg_get_functiondef('''||sch||'.'||fun||'''::regprocedure)';
return true;
exception when others then 
return false;
end;
$$ language plpgsql
和使用:

select function_exists('public','function_name()')
一艘班轮:

SELECT to_regproc('schema_name.proc_name')不为空
一个衬里:

SELECT to_regproc('schema_name.proc_name')不为空

或者您需要将其连接到pg_名称空间以同时检查架构名称感谢添加名称空间的提示,它有助于。。。按照@wingedparter下面给出的脚本进行操作,成功了!您需要将其连接到pg_名称空间以检查模式名称感谢添加名称空间的提示,它有助于。。。按照@wingedparter下面给出的脚本进行操作,成功了!谢谢你的提示@wingedparter!函数中所需的全部内容是执行(sch | | |'。| | fun)::regprocedure。动态查询是不必要的,并且
pg_get_functiondef()
没有做任何事情。还要注意的是,捕获异常基本上等同于回滚到保存点,因此我通常会尝试用这种简单的方法来避免它。对于9.4+,有一个函数的作用几乎是相同的(只需使用
检查其结果是否为NULL
,以确定该函数是否存在)。对于一个名称测试(没有函数签名),有
to_regproc()
函数(但当名称不明确时,它将返回
NULL
。@pozs感谢headup,我正在使用9.2tanks作为提示@wingedparter!函数中所需的全部内容是执行(sch | | |'。| | fun)::regprocedure。动态查询是不必要的,并且
pg_get_functiondef()
没有做任何事情。还要注意的是,捕获异常基本上等同于回滚到保存点,因此我通常会尝试用这种简单的方法来避免它。对于9.4+,有一个函数的作用几乎是相同的(只需使用
检查其结果是否为NULL
,以确定该函数是否存在)。对于一个名称测试(没有函数签名),有
to_regproc()
函数(但当名称不明确时,它将返回
NULL
。@pozs感谢我使用9.2的headup