1

dblink()呼び出し関数の結果として、upによって生成された結果のレコードを単純に渡すことは可能ですか?

create function execute_generic_sql_on_remote_databases(_sql text) 
return set of record
language plpgsql
as $$
declare
  r record; -- this is already not a real record
begin
  -- get connections to several DBs
  ... 
  -- send _sql queries to the DBs
  ... 
  -- get results of query execution
  loop through connections
    for r in select MAGIC from dblink_get_results(conn, _sql) loop
      return next r;
    end loop;
  end loop;
  -- close connections
  ... 
end;
$$;

この関数は、dblink実際には次のように呼び出すことができます。

select * from execute_generic_sql_on_remote_databases('SELECT 1') as r(i int);

しかし、いくつか必要MAGICです。:(

を使えばplProxy簡単にできますが、dblinkでできるのであれば でどうするかが問題ですplpgsql

4

1 に答える 1

1

可能ですが、扱いが少しぎこちないです。関数への追加パラメーターとして列定義リストを提供し、動的 ​​SQL を作成して実行する必要があります。関数呼び出し自体については、同じ列定義リストをもう一度提供する必要があります。

CREATE OR REPLACE FUNCTION f_generic_dblink(text, text) 
RETURNS SETOF record AS
$body$
BEGIN
-- $1 .. sql -String to be executed on remote server
-- $2 .. column type definition string like 'a int, b text'

RETURN QUERY EXECUTE '
SELECT *
FROM   dblink(''port=5432 dbname=falter'', $1) AS (' || $2 || ')'
USING $1;

END;
$body$
    LANGUAGE plpgsql;

電話:

SELECT * FROM f_generic_dblink('SELECT 1', 'i int' ) AS k(i int);

SELECT * FROM f_generic_dblink('SELECT 1, ''foo''', 'i int, t text')
                                                AS k(i int, t text);

気をつけろ!$2 は SQL インジェクションに対して脆弱です。

新しいSQL/MED 機能に興味があるかもしれません。

于 2011-12-23T18:29:16.030 に答える