2014-05-21 23 views
5

W PostgreSQL, można połączyć do innych baz danych za pomocą dblink tak:Możliwe jest użycie TYPU PostgreSQL do zdefiniowania tabeli dblink?

SELECT * 
FROM dblink (
    'dbname=name port=1234 host=host user=user password=password', 
    'select * from table' 
) AS users([insert each column name and its type here]); 

Ale to jest dość rozwlekły.

Skróciłem go, używając dblink_connect i dblink_disconnect, aby wyodrębnić ciąg połączenia z moich zapytań dblink. Jednak to nadal pozostawia mnie z ręczną definicją tabeli (tj. [insert each column name and its type here]).

Zamiast ręcznie definiować tabelę, czy istnieje sposób, w jaki mogę ją zdefiniować za pomocą TYPE lub czegokolwiek, co mogłoby być ponownie użyte?

W moim przypadku liczba zdalnych tabel, do których muszę się przyłączyć, oraz liczba kolumn, których to dotyczy, powoduje, że moje zapytanie jest ogromne.

Próbowałem coś wzdłuż linii:

SELECT * 
FROM dblink (
    'myconn', 
    'select * from table' 
) AS users(postgres_pre_defined_type_here); 

Ale otrzymałem następujący błąd:

ERROR: a column definition list is required for functions returning "record"

+0

Niestety nie sądzę, istnieje jakikolwiek sposób, aby użyć rodzaju jak liście kolumna rozdzielczości dla funkcji, które zwracają 'RECORD'. –

+0

Rekord może być rzutowany na dobrze znany typ wiersza. Ale zbiór rekordów nie może, AFAIK. –

Odpowiedz

2

Jak można rozważyć utworzenie kilku rodzajów dla dblink można przyjąć tworząc kilka funkcji także. Funkcje będą dobrze zdefiniowane i bardzo łatwe w użyciu.

Przykład:

create or replace function dblink_tables() 
returns table (table_schema text, table_name text) 
language plpgsql 
as $$ 
begin 
    return query select * from dblink (
     'dbname=test password=mypassword', 
     'select table_schema, table_name from information_schema.tables') 
    as tables (table_schema text, table_name text); 
end $$; 

select table_name 
from dblink_tables() 
where table_schema = 'public' 
order by 1 
+0

Tak, funkcja jako opakowanie wygląda jak najlepsze rozwiązanie. –

+0

Świetny pomysł - nigdy nie myślałem o zawijaniu moich połączeń 'dblink' w ich własnej funkcji - dzięki! –