Postgresql: dblink в хранимых функциях - PullRequest
2 голосов
/ 27 мая 2011

Я хочу вставить первые 20 строк из таблицы tbl_A в db_A в tbl_B в db_B.
Схема для tbl_A и tbl_B:

CREATE TABLE <tbl_name> (
 id   serial  PRIMARY KEY,
 int  a,
 int b
);

У меня есть несколько вопросов, связанных со следующими запросами

psql db_A
SELECT dblink_connect("dbname=db_B");
SELECT dblink_open('curse', 'SELECT id, a, b FROM tbl_B');
INSERT INTO tbl_A (SELECT id, a, b FROM dblink_fetch('curse', 20) AS (s_is int, s_a int, s_b int)) RETURNING a;
  • Могу ли я поместить следующие выражения в хранимую процедуру:
  • Можно ли создать хранимую процедуру из трех вышеупомянутых операторов вместе и создать подготовленный оператор этой процедуры.

Буду очень признателен, если кто-нибудь прокомментирует, насколько хорошо использовать курсор, или использовать dblink внутри хранимых процедур, или любые другие способы, которые вышеописанно достигаются более элегантно.

1 Ответ

4 голосов
/ 15 июля 2011

Есть гораздо более простой способ:

Подключитесь к db_B и выполните следующее:

CREATE OR REPLACE FUNCTION dblink(text, text)
RETURNS SETOF record AS
  '$libdir/dblink', 'dblink_record'
  LANGUAGE 'c' VOLATILE STRICT
  COST 1
ROWS 1000;
ALTER FUNCTION dblink(text, text) OWNER TO postgres;
GRANT EXECUTE ON FUNCTION dblink(text, text) TO public; -- or whatever

INSERT INTO tbl_B select * from 
 (SELECT * from dblink('hostaddr=localhost port=5432 dbname=db_A user=postgres password=postgres',
'select id, a, b from tbl_A limit 20 '
)
t(
  id integer,
  a integer,
  b integer
)) as q;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...