1

在 PostgreSQL 9.5 下,在我编写的一个 C 函数中,ARR_ELEMTYPE(PG_GETARG_ARRAYTYPE_P(0))其中 (0) 是一个复合类型数组(即由 定义CREATE TYPE),返回 28642010。这个数字没有出现在源代码中,也没有记录在案。

今天,我升级到 PG 9.6,我的 C 函数抛出了错误。elemtype 现在报告为 16396。这也不会出现在源代码中。

我在 wiki 和源代码中搜索了十进制和十六进制的两个数字。

我看不出a)源代码中没有定义OID,b)数字随着PG的变化而变化。

我在这里错过了什么吗?

4

1 回答 1

1

您在数据库中创建的任何对象(包括类型)的 Oid 都是由系统分配的,并且如果您转储数据库并将其恢复到不同的数据库,它将会更改。

要从 C 函数的名称和模式的 Oid 中找出类型的 Oid,可以执行以下操作:

typoid = GetSysCacheOid2(TYPENAMENSP,
                         CStringGetDatum(typeName),
                         ObjectIdGetDatum(typeNamespace));
于 2016-10-05T10:38:25.423 回答