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

如何通过查询判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:33:19