2

db_A のテーブル tbl_A から db_B の tbl_B に上位 20 行を挿入したいと考えています。
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;
  • 次のステートメントをストアド プロシージャに入れることはできますか。
  • 上記の 3 つのステートメントを組み合わせたストアド プロシージャを作成し、そのプロシージャのプリペアド ステートメントを作成することは可能ですか。

誰かがカーソルを使用すること、またはストアドプロシージャ内でdblinkを使用すること、または上記をよりエレガントに実現する他の方法を使用することがどれほど良い方法であるかについてコメントできれば、非常に感謝しています。

4

1 に答える 1

5

もっと簡単な方法があります:

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;
于 2011-07-15T15:05:28.203 に答える