Кажется, ваша функция на самом деле возвращает результат запроса SELECT, а не логическое значение, поэтому returns boolean
неверно для начала.
Чтобы вернуть результат, вам нужно объявить функцию как returns table()
. Но так как вы, кажется, просто возвращаете строки из таблицы building
, вы можете определить ее как returns setof building
.
Затем удалите бесполезный динамический SQL, который кажется совершенно ненужным.
В PL / pgSQL нет табличных переменных, и копирование результата запроса в один перед возвратом результата из этой таблицы представляется ненужным шагом, который только замедляет работу. В Postgres вы просто возвращаете результат запроса, нет необходимости хранить его локально.
Дополнительно: вместо того, чтобы приводить параметр к другому типу внутри функции, лучше объявить этот параметр с ожидаемым вами типом.
Таким образом, упрощенная версия этой функции в PostgreSQL будет выглядеть так:
CREATE OR REPLACE FUNCTION ETL_GetBuildingDetailsByUserID ( p_nInstID text)
RETURNS setof building
AS $$
select building.*
from building
WHERE building.nbuilding_inst_id = p_nInstID
$$ LANGUAGE sql;
Вы можете использовать это так:
select *
from ETL_GetBuildingDetailsByUserID ('42');
Не имеет отношения, но: использование numeric(18,0)
для столбцов, в которых хранятся значения без десятичных знаков, является излишним. Вы должны определить эти столбцы как bigint
. Гораздо быстрее и занимает меньше места, чем числовой.