9

我正在使用 PostgreSQL C API,libpq。我需要能够将 a 中的值转换PGresult*为它们在 Ruby 中的等效数据类型。我目前只是选择所有数据并使用PQgetvalue(),这给了我一个char*可以转换为 ruby​​ 字符串。这很容易。但是有没有人可以分享根据返回的 OID从char*to或进行类型转换的示例?intfloatdoublePQftype()

实际上,简而言之,我不知道如何解释 OID,并且文档似乎没有给出任何指示。我找到了这个页面,但这无助于理解如何使用这个 OID 在 C API 中进行类型转换。我猜在某个地方有一个常量列表,我可以从中做一个大的 switch 语句?

4

2 回答 2

14

我问了这个问题后找到了答案。基本上,除了 libpq-fe.h 和 postgres.h 之外,还有一个名为 catalog/pg_type.h 的文件。在包含 libpq-fe.h 和 postgres.h 后需要包含,然后您可以访问定义,如,TEXTOID等。BOOLOIDINT4OID

#include <stdio.h>
#include <postgres.h>
#include <libpq-fe.h>
#include <catalog/pg_type.h>

// ... snip ...

if (PQgetisnull(result, row, col)) {
  // value is NULL, nothing more to do
} else {
  char * value  = PQgetvalue(result, row, col);
  int    length = PQgetlength(result, row, col);

  switch (PQftype(result, col)) {
    case INT2OID:
    case INT4OID:
    case INT8OID:
      // process value as an integer
      break;

    default:
      // just default to a text representation
  }
}

您需要查看 pg_type.h 中的所有 OID 以实际拥有一个广泛的列表,或者只是测试您在执行基本SELECT 't'::boolean类型查询等时返回的内容,并仅在您需要新类型支持时构建开关。

于 2012-09-21T13:46:30.057 回答
4

要从 OID 获取类型名称,只需将其转换为regtype

SELECT  700::oid::regtype -- real

要获取任何列的类型(或 plpgsql 中的变量),请使用pg_typeof()

SELECT  pg_typeof(1::real) -- real

为您提供与 psql 或 pgAdmin类似的类型regtype的答案。如果需要,您可以将其显式转换为:displayedtexttext

SELECT  pg_typeof(1::real)::text -- real

还有这个“大列表”,vulgo 目录表pg_type,其中注册了类型。这可能很大,看看:

SELECT * from pg_type LIMIT 10;

优秀手册中的更多信息。

于 2012-09-21T12:34:37.183 回答