You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SELECT语句查询PostgreSQL存储过程的注释

解决方法

你不需要手动提前查询存储过程的objoid,可以通过PostgreSQL内置的系统表关联、或者专用的对象注释函数直接拿到注释内容,以下是几种常用写法:

方法1:使用内置obj_description函数(最简洁)

PostgreSQL提供了专门读取对象注释的内置函数,配合regprocedure类型可以自动解析存储过程的OID,不需要手动关联多表:

SELECT obj_description('my_procedure(int)'::regprocedure, 'pg_proc') AS procedure_comment;

注意:PostgreSQL支持存储过程/函数重载,必须在括号里写全入参类型,才能唯一定位到你创建的入参为INT的存储过程。如果存储过程在非public的自定义schema下,需要补全schema名,比如'myschema.my_procedure(int)'::regprocedure。

方法2:直接查询pg_description表(适配你原来的写法)

存储过程的元数据统一存在系统表pg_proc中,该表的oid字段就是你要填的objoid,直接关联查询即可:

SELECT d.*
FROM pg_description d
JOIN pg_proc p 
  ON p.oid = d.objoid
JOIN pg_namespace n 
  ON n.oid = p.pronamespace
WHERE 
  p.proname = 'my_procedure'
  -- 匹配入参类型,INT类型对应OID为23,多参数按定义顺序写即可
  AND p.proargtypes = ARRAY[23]::oid[]
  -- 指定存储过程所在schema,默认是public
  AND n.nspname = 'public'
  -- 筛选对象为存储过程而非普通函数:存储过程prokind值为'p',普通函数为'f'
  AND p.prokind = 'p';

如果不想记参数类型对应的OID,可以用format_type函数做匹配,写法更直观:

SELECT d.*
FROM pg_description d
JOIN pg_proc p 
  ON p.oid = d.objoid
JOIN pg_namespace n 
  ON n.oid = p.pronamespace
WHERE 
  p.proname = 'my_procedure'
  AND n.nspname = 'public'
  AND p.prokind = 'p'
  -- 按参数类型名匹配
  AND array_to_string(ARRAY(SELECT format_type(unnest(p.proargtypes), null)), ',') = 'int';

额外快捷方式

如果你用的是官方psql命令行客户端,直接执行元命令就能直接看到存储过程的所有信息(包含注释),不需要写SELECT语句:

\df+ my_procedure

注意:不要硬编码存储过程的OID值,OID是数据库实例内的对象唯一标识,在不同库、不同实例下数值都不一样,通过系统表关联或者reg类型解析拿到的OID才是准确的。

内容的提问来源于stack exchange,提问作者jasonmoth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:46:00