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)
당신은 당신의 유형은 항상 동기화하지만이 일을해야하는지 확인해야합니다
귀하의 도움이 필요합니다. 나는 처음에 요청한 것을하려고 노력하고 있지만 나는 내 길을 찾을 수 없다. ... –
나는 중개 기능 ('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? 감사합니다 –