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 回答