2011-12-23 3 views
1

が、それは単に呼び出し元の関数の結果として、dblink()アップによって生成されたレコードを渡すことができ、何かのように:押したレコード

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; 
$$; 

一つは、これを呼び出すことができます

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

しかし、それはいくつかのMAGICを必要とします:実際にdblinkのような機能。 :(

簡単にplProxyを使用していることを行うことは可能ですが、問題は、それがすべてでplpgsqlで可能であるならば、dblinkでそれを行う方法である。それは可能ある

答えて

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 featuresに興味があるかもしれません。

+0

答えをいただきありがとうございます。そのようなソリューションの構文は実際には厄介です...残念です。 これで、追加のplProxy接続設定を行って、plProxyでラップされたストアドプロシージャを実行するとします。 – valgog

関連する問題