#author("2017-05-12T23:05:41+09:00","","")
[[PostgreSQL]]

#contents

* 外部テーブル他,各種情報の取得 [#ma8955ad]

[[view source on doxygen.postgresql.org>https://doxygen.postgresql.org/foreign_8c.html#a3b7ac6e54e9ea1fa327c25ad83208a52]]
#geshi(c){{
#include "foreign/foreign.h"
/*
[Sample]
  CREATE SERVER postgres_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
  CREATE USER MAPPING FOR PUBLIC SERVER postgres_server OPTIONS (...);
  CREATE FOREIGN TABLE T (....) SERVER postgres_server
  OPTIONS (table_name 'warehouse', schema_name 'sales');
 */

ListCell *lc;

// 外部テーブル情報取得
ForeignTable *table = GetForeignTable(foreigntableid);
foreach(lc, table->options)
{
    DefElem *def = (DefElem*)lfirst(lc);
    elog(NOTICE, "%s = %s", def->defname, defGetString(def));
}

// server情報取得
ForeignServer *server = GetForeignServer(table->serverid);
elog(NOTICE, "servername = %s", server->servername);
foreach(lc, server->options)
{
    DefElem *def = (DefElem*)lfirst(lc);
    elog(NOTICE, "%s = %s", def->defname, defGetString(def));
}

// ForeignDataWrapper情報取得
ForeignDataWrapper *wrapper = GetForeignDataWrapper(server->fdwid);
elog(NOTICE, "fdwname = %s", wrapper->fdwname);
foreach(lc, wrapper->options)
{
    DefElem *def = (DefElem*)lfirst(lc);
    elog(NOTICE, "%s = %s", def->defname, defGetString(def));
}

// UserMapping情報取得
UserMapping *mapping = GetUserMapping(wrapper->owner, server->serverid);
elog(NOTICE, "serverid = %d, userid = %d", mapping->serverid, mapping->userid);
foreach(lc, mapping->options)
{
    DefElem *def = (DefElem*)lfirst(lc);
    elog(NOTICE, "%s = %s", def->defname, defGetString(def));
}
}}

* テーブル属性の取得 [#eacff995]

以下では,Oidが24576のテーブルをオープンし属性名のリストを取得している。

#geshi(c){{
Relation rel;
Oid relid = 24576;
rel = heap_open(relid, NoLock);
TupleDesc tupdesc = RelationGetDescr(rel);
for (int i = 1; i <= tupdesc->natts; i++)
{
    Form_pg_attribute attr = tupdesc->attrs[i - 1];
    if (attr->attisdropped)
        continue;

    char *colname = get_relid_attribute_name(relid, i);
    elog(NOTICE, "colname: %s", colname);
}
heap_close(relid, NoLock);
}}



トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP