9

私は PostgreSQL C API の libpq を使用しています。PGresult*a の値を Ruby の同等のデータ型に変換できる必要があります。現在、すべてのデータを選択して を使用しているだけですPQgetvalue()。これによりchar*、ルビー文字列に変換できる が得られます。簡単だ。しかし、によって返された OID に従ってchar*、 から 、たとえば、intfloatまたはへの型変換を行う、誰かが共有できる例はありますか?doublePQftype()

実際、要するに、OID を解釈する方法がわかりません。また、ドキュメントには何の指針も示されていないようです。このページを見つけましたが、この OID を使用して C API で型変換を行う方法を理解するのに役立ちません。大きなスイッチステートメントを作成できる定数のリストがどこかにあると思いますか?

4

2 に答える 2

14

これを聞いて答えを見つけました。基本的に、libpq-fe.hとpostgres.hの横に、catalog/pg_type.hというファイルがあります。libpq-fe.hとpostgres.hをインクルードした後にインクルードする必要があります。そうすれば、、などの定義にアクセスできますTEXTOIDBOOLOIDINT4OID

#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

pg_typeタイプが登録されているこの「大きなリスト」、 vulgo catalog tableもあります。これは大きくなる可能性があります。

SELECT * from pg_type LIMIT 10;

詳細については、優れたマニュアルを参照してください。

于 2012-09-21T12:34:37.183 に答える