postgresql - 如何获取函数参数列表(这样我就可以删除一个函数)

标签 postgresql function ddl catalog

我想让 SQL 删除 PostgreSQL 中的一个函数。我写了 DROP FUNCTION 和一个从 pg_proc 中获取的函数名。那不是问题。但是,如果我将参数留空,它不会删除该功能。

我检查了手册并写了然后我必须用它的参数识别函数来删除它,例如 DROP FUNCTION some_func(text,integer) 而不仅仅是 DROP FUNCTION some_func.

在哪里可以找到参数?在 pg_proc 表中函数的行中没有参数。那么我怎样才能让 SQL 删除函数呢?

最佳答案

Postgres 有一个专门用于此目的的函数。与 Postgres 8.4 一起引入。 The manual:

pg_get_function_identity_arguments(func_oid) ... get argument list to identify a function (without default values) ...

pg_get_function_identity_arguments returns the argument list necessary to identify a function, in the form it would need to appear in within ALTER FUNCTION, for instance. This form omits default values.

使用它(和 Postgres 9.1 引入的 format() ),以下查询生成 DDL 语句以删除与您的搜索词匹配的函数:

SELECT format('DROP %s %I.%I(%s);'
            , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , n.nspname
            , p.proname
            , pg_catalog.pg_get_function_identity_arguments(p.oid)
             ) AS stmt
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  p.proname = 'dblink'                     -- function name
-- AND n.nspname = 'public'                     -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER  BY 1;

系统目录 pg_procPostgres 11 中发生了变化。 proisagg 被替换为 prokind,添加了真正的存储过程。你需要适应。见:

返回:

                  stmt
---------------------------------------------------
 DROP FUNCTION public.dblink(text);
 DROP FUNCTION public.dblink(text, boolean);
 DROP FUNCTION public.dblink(text, text);
 DROP FUNCTION public.dblink(text, text, boolean); 

在示例中找到了四个匹配项,因为 dblink 使用了 overloaded functions .
有选择地运行 DROP 语句!

或者,您可以使用方便的类型转换为 object identifier type regprocedure它返回一个完整的函数签名,包括参数类型:

-- SET LOCAL search_path = '';  -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
            , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , oid::regprocedure
             ) AS stmt
FROM   pg_catalog.pg_proc
WHERE  proname = 'dblink'   -- function name
ORDER  BY 1;

关于postgresql - 如何获取函数参数列表(这样我就可以删除一个函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127274/

相关文章:

python - 一种用于跟踪数据库中表历史记录的命令行/API 工具,它是否存在,或者我应该去开发一个吗?

postgresql - 如何打印代码、PostgreSQL/plpgsql异常类型

django - 使用 psycopg2 将 django 与 postgresql 连接起来

c - 从函数返回矩阵

JavaScript 执行从函数声明开始,而不是从 $(document).ready() 开始?

sql - 如何向现有 SQLite 表添加外键?

postgresql - 无法使用wix工具集创建postgresql数据库

function - 您如何称呼这种函数式语言功能?

sql - Oracle SQL - 检查约束

mysql - 'last_modified' 的默认值无效