如何获取函数参数列表(以便我可以删除函数)

2024-01-15

我想让 SQL 删除 PostgreSQL 中的一个函数。我写的DROP FUNCTION以及从中获取函数名称pg_proc。那不是问题。但是,如果我保留空白参数,它不会删除该函数。

我检查了手册,里面写着我必须识别该函数及其参数才能删除它,例如DROP FUNCTION some_func(text,integer)不只是DROP FUNCTION some_func.

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


Postgres 有一个专门用于此目的的函数。随 Postgres 8.4 引入。手册: https://www.postgresql.org/docs/current/functions-info.html#FUNCTIONS-INFO-CATALOG-TABLE

pg_get_function_identity_arguments(func_oid)...获取参数列表来标识函数(没有默认值)...

pg_get_function_identity_arguments返回参数列表 需要识别一个函数,以它需要出现的形式 在里面ALTER FUNCTION, 例如。这种形式省略了默认值。

使用它(和format() https://www.postgresql.org/docs/current/functions-string.html#FUNCTIONS-STRING-FORMAT,随 Postgres 9.1 引入),以下查询生成 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_proc改变于Postgres 11. proisagg被替换为prokind,添加了真正的存储过程。你需要适应。看:

  • 如何删除 PostgreSQL 中的所有函数? https://dba.stackexchange.com/a/122777/3684

Returns:

                  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 使用重载函数 https://www.postgresql.org/docs/current/xfunc-overload.html.
Run DROP有选择地发言!

或者,您可以使用方便的强制转换到对象标识符类型regprocedure https://www.postgresql.org/docs/current/datatype-oid.html#DATATYPE-OID-TABLE它返回一个完整的函数签名,包括参数类型:

-- 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取函数参数列表(以便我可以删除函数) 的相关文章

随机推荐

  • 尝试更新 Twitter 状态时期望失败

    我似乎无法弄清楚这一点 无论我做什么 我都会收到 417 Expectation failed 错误 我看过的所有地方都说我需要删除 HttpWebRequest 的 Expect 标头 设置静态属性ServicePointManager
  • 通过我的程序路由所有数据包?

    我想构建一个通过我的应用程序路由所有网络流量 不仅仅是 HTTP 的应用程序 基本上 我想要的是给予我的应用程序的所有流量 它们永远不应该到达实际目标 我的应用程序应该处理这个 然后将其转发到服务器 输入也是如此 只是相反 服务器 gt 应
  • 如何根据 Google 表格中的单元格内容发送短信

    这是我上一个问题的后续如何循环 onEdit 函数从 Google 表格中的多行发送电子邮件 https stackoverflow com questions 56533837 how to loop an onedit function
  • PHP cURL 超时被忽略

    Using curl setopt 我已经设定CURLOPT CONNECTTIMEOUT MS到 1000 1 秒 并已设置另一个脚本休眠 5 秒 然后响应 200 OK 使用sleep 我称之为测试目的 我的脚本始终等待响应 即使它应该
  • 私有方法参数

    我有这个带有可选参数的方法 public static Test String connection Int32 retryInfiniteLoopGuard 0 有没有办法以某种方式标记retryInfiniteLoopGuard as
  • Sharepoint 2010 沙盒解决方案错误

    我对 Sharepoint Server 2010 沙箱解决方案有疑问 当我写作时 SPSite site new SPSite http win 5g8rm9qpjrp SPWeb web site OpenWeb 这两行代码 我有这样的
  • Erlang Linux 信号处理

    是否可以通过 Erlang 中的处理程序捕获 Linux 信号 例如 SIGUSR1 无需求助于 C 语言编写的驱动程序 不是真正的答案 2001年有人问 有没有人有unix的例子 Erlang 中的信号处理 我会 我喜欢制作一个负载均衡器
  • 从 TRY CATCH 内的单个语句捕获多个错误消息

    我正在对多个列和表运行一批语句 并希望检索有关发生的错误的信息 该语句是类型更改 varchar 到 nvarchar 当它失败时 它似乎返回 2 个错误 消息 5074 级别 16 状态 1 第 1 行 对象 DF XXX YYY 为 取
  • JQGrid 日期格式

    我正在使用 jQuery JQGrid 插件版本 3 8 2 并且在尝试弄清楚如何格式化日期 时间以进行显示时遇到问题 日期 时间采用 ISO 长格式 即 2011 02 16T14 46 43Z 我希望它以 mm dd yy H m s
  • 如何使用可序列化将类对象存储到内部内存存储中?

    我需要将此对象存储到手机的内部存储器中 并且我有
  • 尝试使用 jq 搜索数组时,数组和字符串无法进行包含检查错误

    我有一个 json 文件 大致如下所示 default name Joe Bloggs email email protected cdn cgi l email protection groups recipients name Jane
  • Codeigniter Active Record HAVING / WHERE db.field = db.field

    有人可以告诉我 这是否可以通过活动记录实现 以及如何实现 this gt db gt select this gt db gt from table1 this gt db gt join table2 table1 id table2 f
  • 如果没有管理员权限,您可以获得哪些注册表访问权限?

    我知道我们不应该再使用注册表来存储应用程序数据 但是在更新旧版应用程序 并希望进行最少的更改 时 非管理员可以使用哪些注册表配置单元 我可以访问所有HKEY CURRENT USER 应用程序当前访问HKEY LOCAL MACHINE 没
  • 实体框架 edmx 点击图表非常慢

    首先了解背景 我在 Windows 10 Pro 笔记本电脑上的 Visual Studio 2015 最新的 nuget 6 1 3 指向本地 SQL Server 2014 SP1 Express 数据库 中有一个数据库优先的 EF6
  • 在 C++ 中删除数组中的重复项同时保留顺序[重复]

    这个问题在这里已经有答案了 可能的重复 如何使向量的元素唯一 删除不相邻的重复项 https stackoverflow com questions 1453333 how to make elements of vector unique
  • 与 .net 和 mono 一起使用的最佳对象关系映射框架?

    我正在为我的学位项目做一些研究 使用 net3 5 和 mono2 0 开发的多平台应用程序 我需要一些关于你们认为最好的对象关系映射框架的意见 该框架也可以与单声道运行 此外 任何有关哪种 ROM 最适合我的项目的意见都会很方便 简单思考
  • Javafx:没有工具包发现异常

    我已在 intellij 插件中添加了 javafx 库 以添加 jfxwebview 但是当我尝试创建 JFXPanel 对象时 JFXPanle jfxpanel new JFXPanel 它给出了以下异常 No toolkit fou
  • 字典中的特征数量

    我正在努力从这样的 pickle 文件加载数据集 Load the dictionary containing the dataset with open final project dataset pkl r as data file d
  • Marklogic 中的 JavaScript 多语句事务

    我想在 marklogic 中的服务器端 JavaScript 中编写多语句事务 我想要实现的是 执行更新事务 然后编写查询语句来查询更新的文档并确认更新在事务中可见 最后进行回滚 通过进行回滚 我想确认事务内进行的更新在事务外不可见 而在
  • 如何获取函数参数列表(以便我可以删除函数)

    我想让 SQL 删除 PostgreSQL 中的一个函数 我写的DROP FUNCTION以及从中获取函数名称pg proc 那不是问题 但是 如果我保留空白参数 它不会删除该函数 我检查了手册 里面写着我必须识别该函数及其参数才能删除它