2011-12-23 66 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; 
$$; 

一個可以把這個功能類似於dblink實際上:

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

但是它需要一些MAGIC。 :(

這是可以做到的,使用plProxy容易,但問題是如何與dblink做到這一點,如果它是可能的plpgsql的。

回答

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 2011-12-27 07:29:59