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

如何通过给定数据类型名称获取PostgreSQL的列Oid?

直接用PostgreSQL内置的C函数就能搞定,不用手动堆类型匹配

PostgreSQL提供了现成的C级别的内置函数来实现从类型名称获取OID的功能,完全不用你手动写一堆strcmp匹配所有类型。

核心函数:typenameTypeId

你要找的就是这个函数,它定义在parser/parse_type.h头文件里,作用是根据传入的类型名称(支持带模式名,比如public.int)返回对应的类型OID。它会自动处理类型的别名、大小写问题,比如"INT"、"INTEGER"、"int4"这些都会正确返回INT4OID,完美覆盖你现在手动处理的场景。

示例替换你的函数

把你原来的自定义函数改成这样就行:

#include "parser/parse_type.h"

static Oid
get_oid_from_type(char *column_type)
{
    // 第二个参数是类型所在的命名空间OID,传InvalidOid表示搜索默认路径
    // 第三个参数是是否允许数组类型,按需设置
    Oid type_oid = typenameTypeId(InvalidOid, column_type, false);
    
    // 如果类型不存在,会返回InvalidOid,这里可以根据需求加错误处理
    if (type_oid == InvalidOid) {
        // 比如返回默认值,或者抛出错误
        return InvalidOid;
    }
    
    return type_oid;
}

补充:更完整的类型信息

如果除了OID还需要类型的其他信息(比如类型长度、是否是数组等),可以用typenameType函数,它返回Type结构体指针,里面包含更详细的类型元数据。

关于你提到的TYPENAMENSP

你猜测的TYPENAMENSP其实是解析类型名时用到的内部结构体,typenameTypeId内部会调用解析逻辑,把输入的类型名字符串转换成TYPENAMENSP结构,再去系统表中查找对应的OID,所以这个函数已经封装了所有你需要的逻辑,不用自己去处理底层的结构体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:35:12