Для ведения делопроизводства в базе данных созданы следующие функции (PostgreSQL 11.4).
- entity_with_multiple_taskexec: возвращает список сущностей, для которых следует вести уборку.
- row_id_to_delete: возвращает кортежи идентификаторов для удаления
Просто для полноты, функция, которая отлично работает:
CREATE OR REPLACE FUNCTION entity_with_multiple_taskexec()
RETURNS TABLE(entitykey varchar) AS
$func$
BEGIN
RETURN QUERY select distinct task.entitykey from
(select task.entitykey from task where dtype = 'PropagationTask' group by task.entitykey having count(*) > (select count(*) from conninstance)) more_than_one_entry
inner join task on task.entitykey = more_than_one_entry.entitykey
inner join taskexec on taskexec.task_id = task.id order by task.entitykey asc;
END
$func$ LANGUAGE plpgsql;
Но какая вторая функция, я 'я не могу вернуть таблицу, созданную в результате циклического просмотра результатов функции entity_with_multiple_taskexec;
CREATE OR REPLACE FUNCTION row_id_to_delete()
RETURNS TABLE(task_id varchar, taskexec_id varchar) AS
$func$
DECLARE
entityrow RECORD;
resultset RECORD;
BEGIN
FOR entityrow IN SELECT entitykey FROM entity_with_multiple_taskexec() LOOP
insert into resultset select task.id as task_id, taskexec.id as taskexec_id from task
inner join taskexec on taskexec.task_id = task.id where taskexec.entitykey = entityrow.entitykey order by taskexec.enddate desc offset 1
END LOOP;
RETURN resultset;
END
$func$ LANGUAGE plpgsql;
Это приводит к следующей ошибке
ERROR: syntax error at or near "END"
LINE 12: END LOOP;
Я пробовал разные подходы. Что было бы хорошим решением для возврата таблицы?