Удаление записей, созданных dblink, из хранимой процедуры вызова - PullRequest
1 голос
/ 23 декабря 2011

Можно ли просто передать результирующие записи, сгенерированные 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 Ответ

1 голос
/ 23 декабря 2011

Это возможно , но обработка немного неловкая. Вам необходимо предоставить список определений столбцов в качестве дополнительного параметра функции и создать и выполнить динамический 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...