如何使用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
相关产品推荐
相关产品推荐

