Как присвоить результат табличной функции переменной в PL / pgSQL - PullRequest
0 голосов
/ 02 мая 2020

Предположим, у меня есть следующее объявление функции:

CREATE OR REPLACE FUNCTION build_org_branch(IN p_org_id organization.org_id%type,
                                            IN p_padding text)
    RETURNS table
            (
                object_id int,
                parent_id int,
                name      text
            )

Затем я хочу вызвать build_org_branch с параметрами и присвоить его переменной внутри другой функции, например:

declare
  l_table record[]; --??????
begin
  l_table := build_org_branch(1, ' '); -- is it okay?
  if l_table is not null then
    -- do stuff with table rows
  end if;
end;

Или я должен использовать какой-то другой подход для передачи таблиц строк?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы создали функцию, которая возвращает таблицу, поэтому обрабатывайте результаты таким образом.

do $$ 
declare 
  rec record;
begin
  for rec in (select * from build_org_branch(101, ''))
  loop 
      raise notice 'Returned Row: object_id=>%, name=>%, parent_id=>%'
                 , rec.object_id
                 , rec.name
                 , rec.parent_id ; 
      -- do stuff with table rows
   end loop;             
end;
$$; 

У меня нет вашей таблицы, поэтому я жестко закодирую некоторые значения, но как они заполняются, не проблема, а то, что вы делаете потом. См скрипка .

1 голос
/ 02 мая 2020

Postgres не поддерживает переменные таблицы. Если вы можете передать некоторый реляционный контент, то а) вы можете использовать временную таблицу или б) вы можете передать массив составных значений:

CREATE TYPE branch_type AS 
(
  object_id int,
  parent_id int,
  name      text
)

CREATE OR REPLACE FUNCTION build_org_branch(IN p_org_id organization.org_id%type,
                                            IN p_padding text)
  RETURNS branch_type[] AS ...

и затем вы можете написать

declare
  l_table branch_type[];
begin
  l_table := build_org_branch(1, ' ');
  if l_table is not null then
    -- do stuff with table rows
  end if;
end;

Это присвоение массива массиву. Таблица к массиву также возможна, но всегда она должна быть набрана c.

CREATE OR REPLACE FUNCTION build_org_branch(IN p_org_id organization.org_id%type,
                                            IN p_padding text)
  RETURNS SETOF branch_type AS ...

и обработка:

declare
  l_table branch_type[];
begin
  l_table := ARRAY(SELECT build_org_branch(1, ' '));
  if l_table is not null then
    -- do stuff with table rows
  end if;
end;

Для меньшего количества строк (до десяти тысяч) массив должен быть предпочтительным. Для большого количества строк следует использовать временную таблицу.

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