2013-08-19 1 views
6

dblink를 사용하여 데이터베이스간에 특정 데이터를 이동합니다. 모든 것이 저장되고 소리가 나는데 dblink 쿼리 결과의 열 정의 목록을 정의하는보다 편리한 방법이 있는지 궁금합니다. 나는 이런 식으로 뭔가를 할 수 있습니다로컬 기존 유형에서 dblink 열 정의 목록 지정

SELECT * 
FROM dblink('dbname=remote', 'select * from test') 
AS t1(id integer, data text); 

내가와 상호 작용하고있어 표는 두 데이터베이스 (원격 & 로컬)에서 동일한 스키마 정의를 가지고있다. 내가 좋아하는 뭔가 생각 :

SELECT * 
FROM dblink('dbname=remote', 'select * from test') 
AS t1 LIKE public.test; 

또는를 :

SELECT * 
FROM dblink('dbname=remote', 'select * from test') 
AS t1::public.test; 

열 정의 목록은 상당히 길어질 경향이있다. 간과할만한 것이 있습니까?

편집 :이 해결 방법으로 작은 함수를 작성하기 전에이 나를 ​​위해 문제가있다으로

.

CREATE OR REPLACE FUNCTION dblink_star_func(_conn text, _schema_name text, _table_name text) 
RETURNS text 
LANGUAGE PLPGSQL 
VOLATILE STRICT 
AS $function$ 
    DECLARE  
     _dblink_schema text; 
     _cols   text; 
     _q    text; 
     _func_name  text := format('star_%s', $3); 
     _func   text;   
    BEGIN 
     SELECT nspname INTO _dblink_schema 
     FROM pg_namespace n, pg_extension e 
     WHERE e.extname = 'dblink' AND e.extnamespace = n.oid; 

     SELECT array_to_string(array_agg(column_name || ' ' || udt_name), ', ') INTO _cols 
     FROM information_schema.columns 
     WHERE table_schema = $2 AND table_name = $3; 

     _q := format('SELECT * FROM %I.dblink(%L, %L) AS remote (%s)', 
      _dblink_schema, 
      _conn, 
      format('SELECT * FROM %I.%I', $2, $3), 
      _cols 
     ); 

     _func := $_func$ 
      CREATE OR REPLACE FUNCTION %s() 
      RETURNS SETOF %I.%I 
      LANGUAGE SQL 
      VOLATILE STRICT 
      AS $$ %s; $$ 
     $_func$; 

     EXECUTE format(_func, _func_name, $2, $3, _q); 

     RETURN _func_name; 
    END; 
$function$; 

이 함수는 dblink 호출을 래핑하는 함수를 생성하고 생성합니다. 그것은 무거운 짐을 싣기위한 것이 아니라 편리함을 의미합니다. 그것이 필요 없다고 판명되면 좋을 것입니다.

> select dblink_star_func('dbname=ben', 'public', 'test'); 
┌──────────────────┐ 
│ dblink_star_func │ 
├──────────────────┤ 
│ star_test  │ 
└──────────────────┘ 
(1 row) 

> select * from star_test() where data = 'success'; 
┌────┬─────────┐ 
│ id │ data │ 
├────┼─────────┤ 
│ 1 │ success │ 
└────┴─────────┘ 
(1 row) 
당신은 당신의 유형은 항상 동기화하지만이 일을해야하는지 확인해야합니다
+0

귀하의 도움이 필요합니다. 나는 처음에 요청한 것을하려고 노력하고 있지만 나는 내 길을 찾을 수 없다. ... –

+0

나는 중개 기능 ('dblink_star_func')없이 멋진 코드의 버전을 만들 수 있다고 strugling하고있다. 'select * from select_remote ('dbname = ben', 'public', 'test') 여기서 data = 'success'; '곧바로. 거기에 내 질문을 좀 봐 줄래 : http://stackoverflow.com/questions/25691511/postgresql-error-structure-of-query-does-not-match-function-result-type-using? 감사합니다 –

답변

1

:

SELECT (t1::test).* 
    FROM dblink('dbname=remote', 'select * from test') AS t1; 

키는 자주 파서 당신이 다루고있는 알고 있다는 것을 확인하기 위해 괄호가 필요하다는 것입니다 튜플.

CREATE TABLE test (id int, test bool); 
select (t1::test).* from (select 1, true) t1; 

을하지만이 구문 오류가 발생합니다 :

예를 들어이 나를 위해 작동

select t1::test.* from (select 1, true) t1; 
+5

'dblink' (Postgres 9.1)에서는 작동하지 않습니다. 'record "를 반환하는 함수에 대해 열 정의 목록이 필요합니다. – ADTC

+0

@ADTC 재미있는 점은'dblink' 함수가'dblink_connect'에서'dblink_connect'로 변경되어 현재 작동하지 않기 때문입니다. –

+0

@ Rémy Baron의 해답을 참조하십시오. Postgres 9.6에서 작동합니다. – kirikaza

4

이 같은 것을보십시오 :

select (rec).* from dblink('dbname=...','select myalias from foreign_table 
    myalias') t1 (rec local_type) 

예제 (에서 테이블 통계를 얻을 수를 다른 데이터베이스) :

select (rec).* from dblink('dbname=foreignDb','select t1 from 
    pg_stat_all_tables t1') t2 (rec pg_stat_all_tables) 
관련 문제