Postgresql: dblink в хранимых функциях

Я хочу вставить первые 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 внутри хранимых процедур или любые другие способы, которые выше, достигаются более элегантно.


person Mayank    schedule 27.05.2011    source источник


Ответы (1)


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

Подключитесь к 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;
person ertx    schedule 15.07.2011
comment
Можно ли обновить запрос в процедуре с помощью dblink? - person PrashantAdesara; 10.09.2012
comment
Подумайте о том, что вы напишете в последнем параметре, вызывающем функцию 'dblink', как SQL, который будет выполняться в удаленной базе данных. - person ertx; 10.09.2012