2011-12-23 36 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