Re: Preserving datatypes in dblink.

From: Joe Conway <mail(at)joeconway(dot)com>
To: Bhuvan A <bhuvansql(at)linuxfreemail(dot)com>
Cc: pgsql-admin(at)postgresql(dot)org
Subject: Re: Preserving datatypes in dblink.
Date: 2002-08-23 06:07:03
Message-ID: 3D65D107.9070307@joeconway.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin

Bhuvan A wrote:
> Hi,
>
> I am using postgresql 7.2.1.
>
> I am using dblink function in order to execute remote queries. I did this
> by creating a view (as suggested by README.dblink). Here i found a strange
> thing that the datatype of all the fields of this view is set to text,
> irrespect of the source datatype.
>
> Here is an example.
>
> # \c db1
> # \d my_table
> Table "my_table"
> Column | Type | Modifiers
> --------+--------------------------+---------------
> key | text |
> value | text |
> ctime | timestamp with time zone | default now()
> mtime | timestamp with time zone |
>
> # \c db2
> # CREATE VIEW dbl_my_view AS SELECT dblink_tok(t.ptr, 0) AS key,
> dblink_tok(t.ptr, 1) AS value, dblink_tok(t.ptr, 2) AS ctime,
> dblink_tok(t.ptr, 3) AS mtime FROM (SELECT dblink('hostaddr=192.168.1.15
> port=5432 dbname=db1 user=my_user password=my_pass', 'select key, value,
> ctime, mtime from my_table') AS ptr) t;
> CREATE
> # \d dbl_my_view
> View "dbl_my_view"
> Column | Type | Modifiers
> --------+------+-----------
> key | text |
> value | text |
> ctime | text |
> mtime | text |
> View definition: SELECT dblink_tok(t.ptr, 0) AS "key", dblink_tok(t.ptr,
> 1) AS value, dblink_tok(t.ptr, 2) AS ctime, dblink_tok(t.ptr, 3) AS mtime
> FROM (SELECT dblink('hostaddr=192.168.1.15 port=5432 dbname=db1
> user=my_user password=my_pass', 'select key, value, ctime, mtime from
> my_table'::text) AS ptr) t;
>

That's because dblink_tok is declared to return text (it *has* to be
declared to return something, so text is the best choice). Explicitly
cast the columns in you view to whatever datatype is correct. I.e.
(untested)

CREATE VIEW dbl_my_view AS
SELECT
dblink_tok(t.ptr, 0) AS "key",
dblink_tok(t.ptr,1) AS value,
dblink_tok(t.ptr, 2)::timestamp with time zone AS ctime,
dblink_tok(t.ptr, 3)::timestamp with time zone AS mtime
FROM (SELECT dblink('hostaddr=192.168.1.15 port=5432 dbname=db1
user=my_user password=my_pass', 'select key, value, ctime, mtime from
my_table'::text) AS ptr) t;

Joe

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Hans Huber 2002-08-23 08:14:49 Problem with Dump
Previous Message Bhuvan A 2002-08-23 05:54:04 Preserving datatypes in dblink.