PostgreSQL Определяемый пользователем тип таблицы в памяти - PullRequest
0 голосов
/ 20 апреля 2020

Если есть несколько хранимых процедур (функций в PG), которым необходимо передавать промежуточный набор результатов между ними (максимум 1 КБ)

Я могу сделать это в других СУБД, но хотел бы знать, как contribli sh это в нативном PostgreSQL.

В частности, поддерживает ли PG:

CREATE TYPE MyTable AS TABLE(...)

Также можем ли мы сделать это полностью в памяти?

Я хочу передать «MyTable» между несколькими процессами в качестве входных и выходных.

Или, возможно, я мог бы построить этот набор результатов и передать его как параметр JSONB?

Мне нужно, чтобы это было невероятно быстро, нет Неважно, как это делается.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Вы можете передать массив типа таблицы:

create function function_one()
  returns void
$$
declare
  l_rows my_table[];
begin
  select array_agg(mt)
    into l_rows
  from my_table mt
  where ...;

  perform function_two(l_rows);
  perform function_three(l_rows);
end;
$$
language plpgsql;
0 голосов
/ 21 апреля 2020

Вопрос немного неясен, но, вероятно, лучше всего провести курсор между функциями.

Вот игрушечный пример, см. документацию для получения дополнительной информации:

CREATE FUNCTION a() RETURNS refcursor
   LANGUAGE plpgsql AS
$$DECLARE
   c refcursor := 'cursorname';
BEGIN
   OPEN c FOR SELECT 42 AS col1;
   RETURN c;
END;$$;

CREATE FUNCTION b() RETURNS SETOF integer
   LANGUAGE plpgsql AS
$$DECLARE
   c refcursor;
   r record;
BEGIN
   c := a();

   LOOP
      FETCH NEXT FROM c INTO r;
      EXIT WHEN NOT FOUND;
      RETURN NEXT r.col1;
   END LOOP;
END;$$;

Этот пример работает так:

SELECT * FROM b();

 b  
----
 42
(1 row)
...