如何通过查询判断PostgreSQL函数是否为标量及获取其列表?
获取PostgreSQL中标量函数列表的方法
不用靠正则猜类型,直接查PostgreSQL的系统表就能准确筛选标量函数,核心是区分返回单个值和返回集合/表的函数,以下是可行的查询方案:
基础筛选:排除返回集合的函数
标量函数的核心特征是返回单个值,而非集合(SETOF/TABLE),PostgreSQL的pg_proc表中proretset字段直接标记了函数是否返回集合,用这个字段就能精准过滤:
SELECT proname AS function_name, pg_get_function_arguments(oid) AS args, pg_type.typname AS return_type, pg_get_function_def(oid) AS definition FROM pg_proc JOIN pg_type ON pg_proc.prorettype = pg_type.oid WHERE -- 关键:只保留不返回集合的函数 proretset = false -- 可选:排除系统自带函数(pg_catalog/information_schema下的) AND pronamespace NOT IN (SELECT oid FROM pg_namespace WHERE nspname IN ('pg_catalog', 'information_schema')) ORDER BY function_name;
进阶:精准筛选基本标量类型
如果需要严格排除复合类型(比如返回自定义行类型的函数),可以结合pg_type的typtype字段:
b:基本类型(int、text、bool等)d:域类型(基于基本类型的自定义约束类型)c:复合类型(行类型)
调整查询条件,只保留基本标量和域类型:
SELECT proname AS function_name, pg_get_function_arguments(oid) AS args, pg_type.typname AS return_type, pg_get_function_def(oid) AS definition FROM pg_proc JOIN pg_type ON pg_proc.prorettype = pg_type.oid WHERE proretset = false AND pronamespace NOT IN (SELECT oid FROM pg_namespace WHERE nspname IN ('pg_catalog', 'information_schema')) -- 只保留基本标量和域类型 AND pg_type.typtype IN ('b', 'd') ORDER BY function_name;
为什么不用正则?
正则依赖类型名称的格式(比如猜SETOF开头的是集合),但自定义类型名称可能包含特殊关键词,容易误判。而系统表的字段是PostgreSQL内部维护的元数据,准确性完全有保障。
内容的提问来源于stack exchange,提问作者Flex1sh
相关产品推荐
相关产品推荐

