web-dev-qa-db-ja.com

dblinkを使用してリモートデータをフェッチし、複数のローカルテーブルに挿入する関数/手順

リモートデータベースからデータをフェッチし、3つのローカルテーブルに挿入しようとしています。現在、データを1つのテーブルに正常に取得するクエリがあります。

しかし、私は今、3つのテーブルにデータを挿入することを含む手順全体を実行する関数を作成することを考えていました。ここで行き詰まっていると思います...

4
G. Ngotho

data-modifying CTE (PostgreSQL 9.1で導入)を使用すると、パフォーマンスを向上させることができます。次のデモを検討してください。

CREATE OR REPLACE FUNCTION f_fetch3()
  RETURNS text AS
$func$

SELECT public.dblink_connect(
      'hostaddr=?.?.?.? port=5432 dbname=db user=postgres password=???');

-- Truncate tables first?
-- TRUNCATE tbl1, tbl2, tbl3;

WITH i AS (
    SELECT *
    FROM public.dblink(
        'SELECT id
               ,col1
               ,col2
               ,col3
        FROM    remote_tbl'
         ) AS d (id int, col1 text, col2 text, col3 text)
    )
    , x AS (
    INSERT INTO tbl1
    SELECT id, col1
    FROM   i
    )
    , y AS (
    INSERT INTO tbl2
    SELECT id, col2
    FROM   i
    )
INSERT INTO tbl3
SELECT id, col3
FROM   i;

/* -- Analyze tables?
ANALYZE tbl1;
ANALYZE tbl2;
ANALYZE tbl3;
*/

SELECT public.dblink_disconnect();

$func$ LANGUAGE sql VOLATILE SECURITY DEFINER
SET search_path=myschema, pg_temp;

ALTER FUNCTION f_fetch3() OWNER TO postgres;
REVOKE ALL ON FUNCTION f_fetch3() FROM public;

コール:

SELECT f_fetch3();

PostgreSQL 9.1.4でテスト済み。

ここにパスワードを入力すると、別のスキーマにその関数が作成され、スキーマからのすべてのアクセスと一般のユーザーからの関数が削除されます。

明らかに dblink がインストールされていますが、一般の人にとっては、拡張機能はデータベースごとに1回インストールする必要があります。

CREATE EXTENSION dblink;
4