如何通过给定数据类型名称获取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
相关产品推荐
相关产品推荐

